diff --git a/modular_starfly/modules/desert-resources/code/game/objects/structures/flora.dm b/modular_starfly/modules/desert-resources/code/game/objects/structures/flora.dm new file mode 100644 index 0000000000..477d2027c3 --- /dev/null +++ b/modular_starfly/modules/desert-resources/code/game/objects/structures/flora.dm @@ -0,0 +1,45 @@ +/obj/structure/flora/ausbushes/moghes + icon = 'modular_starfly/modules/desert-resources/icons/obj/flora/desert.dmi' + icon_state = "firstbush_1" + +/obj/structure/flora/ausbushes/moghes/firstbush1 + icon_state = "firstbush_1" + +/obj/structure/flora/ausbushes/moghes/firstbush2 + icon_state = "firstbush_2" + +/obj/structure/flora/ausbushes/moghes/firstbush3 + icon_state = "firstbush_3" + +/obj/structure/flora/ausbushes/moghes/firstbush4 + icon_state = "firstbush_4" + +/obj/structure/flora/ausbushes/moghes/fullgrass1 + icon_state = "fullgrass_1" + +/obj/structure/flora/ausbushes/moghes/fullgrass2 + icon_state = "fullgrass_2" + +/obj/structure/flora/ausbushes/moghes/fullgrass3 + icon_state = "fullgrass_3" + +/obj/structure/flora/ausbushes/moghes/grassbush1 + icon_state = "grassybush_1" + +/obj/structure/flora/ausbushes/moghes/grassbush2 + icon_state = "grassybush_2" + +/obj/structure/flora/ausbushes/moghes/grassbush3 + icon_state = "grassybush_3" + +/obj/structure/flora/ausbushes/moghes/grassbush4 + icon_state = "grassybush_4" + +/obj/structure/flora/ausbushes/moghes/sparsegrass1 + icon_state = "sparsegrass_1" + +/obj/structure/flora/ausbushes/moghes/sparsegrass2 + icon_state = "sparsegrass_2" + +/obj/structure/flora/ausbushes/moghes/sparsegrass3 + icon_state = "sparsegrass_3" \ No newline at end of file diff --git a/modular_starfly/modules/desert-resources/code/game/objects/structures/signs/signs_flags.dm b/modular_starfly/modules/desert-resources/code/game/objects/structures/signs/signs_flags.dm new file mode 100644 index 0000000000..bec6e81a27 --- /dev/null +++ b/modular_starfly/modules/desert-resources/code/game/objects/structures/signs/signs_flags.dm @@ -0,0 +1,13 @@ +/obj/structure/sign/flag/hegemony + name = "Sothrai Hegemony Blood Horizon flag" + desc = "The national flag of the Sothrai Hegemony. The red streak of the horizon represents the brutality of Moghes, kept at bay by guiding hands of the Sothrai Hegemon." + icon = 'modular_starfly/modules/desert-resources/icons/obj/structures/signs/wallflags.dmi' + icon_state = "flag_hegemony" + item_flag = /obj/item/sign/flag/hegemony + +/obj/item/sign/flag/hegemony + name = "folded Sothrai Hegemony Blood Horizon flag" + desc = "The national flag of the Sothrai Hegemony. The red streak of the horizon represents the brutality of Moghes, kept at bay by guiding hands of the Sothrai Hegemon." + icon = 'modular_starfly/modules/desert-resources/icons/obj/structures/signs/wallflags.dmi' + icon_state = "folded_hegemony" + sign_path = /obj/structure/sign/flag/hegemony \ No newline at end of file diff --git a/modular_starfly/modules/desert-resources/code/modules/mob/living/simple_animal/friendly/moghes.dm b/modular_starfly/modules/desert-resources/code/modules/mob/living/simple_animal/friendly/moghes.dm new file mode 100644 index 0000000000..95144b27da --- /dev/null +++ b/modular_starfly/modules/desert-resources/code/modules/mob/living/simple_animal/friendly/moghes.dm @@ -0,0 +1,107 @@ +/mob/living/simple_animal/threshbeast + name = "threshbeast" + desc = "Large herbivorous reptiles native to Moghes, the azkrazal or 'threshbeast' is commonly used as a mount, beast of burden, or convenient food source by Unathi. They are highly valued for their speed and strength, capable of running at 30-42 miles per hour at top speed. Their favorite foods are grasses and cactus fruits" + icon = 'modular_starfly/modules/desert-resources/icons/mob/moghes/threshbeast.dmi' + icon_state = "threshbeast" + icon_living = "threshbeast" + icon_dead = "threshbeast_dead" + butcher_results = list(/obj/item/stack/sheet/animalhide/lizard = 2, /obj/item/food/meat/slab = 6) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "pushes" + response_disarm_simple = "pushes" + response_harm_continuous = "strikes" + response_harm_simple = "strikes" + speak_chance = 1 + turns_per_move = 5 + speak_emote = list("chuffs", "hisses", "bellows") + emote_hear = list("chuffs", "hisses", "bellows") + emote_see = list("shakes its head", "thumps its tail") + mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE + move_resist = MOVE_FORCE_VERY_STRONG + food_type = list(/obj/item/food/grown/ash_flora/cactus_fruit, /obj/item/food/grown/ash_flora/fern, /obj/item/food/grown/grass, /obj/item/food/grown/grass/fairy, /obj/item/food/grown/grass/carpet) // Herbivore + base_pixel_x = -15 + maxHealth = 100 + health = 100 + tame_chance = 15 + bonus_tame_chance = 30 + speed = 3 + harm_intent_damage = 0 + melee_damage_lower = 12 + melee_damage_upper = 20 + var/saddled = FALSE + +/mob/living/simple_animal/threshbeast/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/saddle) && !saddled) + if(tame && do_after(user, 55, target=src)) + user.visible_message("You manage to put [O] on [src], you can now ride [p_them()].") + qdel(O) + saddled = TRUE + can_buckle = TRUE + buckle_lying = FALSE + add_overlay("threshbeast_saddled") + var/datum/component/riding/D = LoadComponent(/datum/component/riding) + D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 8), TEXT_SOUTH = list(0, 8), TEXT_EAST = list(-2, 8), TEXT_WEST = list(2, 8))) + D.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) + D.set_vehicle_dir_layer(EAST, OBJ_LAYER) + D.set_vehicle_dir_layer(WEST, OBJ_LAYER) + D.drive_verb = "ride" + else + user.visible_message("[src] is rocking around! You can't put the saddle on!") + return + ..() + +/mob/living/simple_animal/threshbeast/brown + icon_state = "threshbeastbrown" + icon_living = "threshbeastbrown" + icon_dead = "threshbeastbrown_dead" + +/mob/living/simple_animal/threshbeast/grey + icon_state = "threshbeastgrey" + icon_living = "threshbeastgrey" + icon_dead = "threshbeastgrey_dead" + +/mob/living/simple_animal/threshbeast/red + icon_state = "threshbeastred" + icon_living = "threshbeastred" + icon_dead = "threshbeastred_dead" + +/mob/living/simple_animal/miervesh + name = "Mier'vesh" + desc = "A small, sweet-tempered flying reptile from Moghes. Frequently samples the air with a long, thin forked tongue. They are popular animals among Ouerean Unathi as they are small and sweet tempered, making them slow to respond to danger." //' + icon = 'modular_starfly/modules/desert-resources/icons/mob/moghes/miervesh.dmi' + icon_state = "miervesh-1" + icon_living = "miervesh-1" + icon_dead = "miervesh-1-dead" + density = FALSE + health = 4 + maxHealth = 4 + butcher_results = list(/obj/item/food/meat/slab/chicken = 1) + melee_damage_upper = 2 + melee_damage_lower = 0 + speak_chance = 1 + speak = list("Chirp!","peep!","tweet!") + speak_emote = list("croons","chirps","hisses") + emote_hear = list("croons.","chirps.","hisses.") + emote_see = list("pecks at the ground","flaps its wings","flicks out its tongue") + turns_per_move = 5 + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently moves aside" + response_disarm_simple = "gently move aside" + response_harm_continuous = "swats" + response_harm_simple = "swat" + a_intent = INTENT_HARM //wild animals aren't going to be your best friend, but a player-controlled one might be tame enough. + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + friendly_verb_continuous = "grooms" + friendly_verb_simple = "groom" + mob_size = MOB_SIZE_SMALL + movement_type = FLYING + +/mob/living/simple_animal/miervesh/red + icon_state = "miervesh-2" + icon_living = "miervesh-2" + icon_dead = "miervesh-2-dead" \ No newline at end of file diff --git a/modular_starfly/modules/desert-resources/code/modules/power/lighting.dm b/modular_starfly/modules/desert-resources/code/modules/power/lighting.dm new file mode 100644 index 0000000000..a61b8b8e26 --- /dev/null +++ b/modular_starfly/modules/desert-resources/code/modules/power/lighting.dm @@ -0,0 +1,18 @@ +/obj/machinery/light/street + name = "street light" + icon = 'modular_starfly/modules/desert-resources/icons/obj/lighting_32x50.dmi' + base_state = "streetlight" + icon_state= "streetlight-on" + desc = "A cheaper-quality streetlight used in small towns." + layer = ABOVE_OBJ_LAYER + brightness = 10 + +obj/machinery/light/street/broken + status = LIGHT_BROKEN + icon_state = "streetlight-broken" + +obj/machinery/light/street/pawn + name = "pawn shop lamp" + base_state = "pawnlight" + icon_state = "pawnlight-on" + desc = "Traditionally, pawn shops used to have lamps featuring three bulbs by their signs. Many pawn shops still use imagery featuring these lamps to this day." \ No newline at end of file diff --git a/modular_starfly/modules/desert-resources/icons/mob/moghes/miervesh.dmi b/modular_starfly/modules/desert-resources/icons/mob/moghes/miervesh.dmi new file mode 100644 index 0000000000..fd0283dd2e Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/mob/moghes/miervesh.dmi differ diff --git a/modular_starfly/modules/desert-resources/icons/mob/moghes/moghes_48.dmi b/modular_starfly/modules/desert-resources/icons/mob/moghes/moghes_48.dmi new file mode 100644 index 0000000000..2110fc3044 Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/mob/moghes/moghes_48.dmi differ diff --git a/modular_starfly/modules/desert-resources/icons/mob/moghes/threshbeast.dmi b/modular_starfly/modules/desert-resources/icons/mob/moghes/threshbeast.dmi new file mode 100644 index 0000000000..02e895cfff Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/mob/moghes/threshbeast.dmi differ diff --git a/modular_starfly/modules/desert-resources/icons/obj/flora/desert.dmi b/modular_starfly/modules/desert-resources/icons/obj/flora/desert.dmi new file mode 100644 index 0000000000..d8cb26bee4 Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/obj/flora/desert.dmi differ diff --git a/modular_starfly/modules/desert-resources/icons/obj/lighting_32x50.dmi b/modular_starfly/modules/desert-resources/icons/obj/lighting_32x50.dmi new file mode 100644 index 0000000000..9db243ed76 Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/obj/lighting_32x50.dmi differ diff --git a/modular_starfly/modules/desert-resources/icons/obj/structures/signs/wallflags.dmi b/modular_starfly/modules/desert-resources/icons/obj/structures/signs/wallflags.dmi new file mode 100644 index 0000000000..dd28594a33 Binary files /dev/null and b/modular_starfly/modules/desert-resources/icons/obj/structures/signs/wallflags.dmi differ diff --git a/shiptest.dme b/shiptest.dme index 67197ed12a..3eefe88688 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1227,7 +1227,6 @@ #include "code\game\machinery\telecomms\machines\server.dm" #include "code\game\MapData\outposts\cybersun_gas_giant.dm" #include "code\game\MapData\shuttles\independent_shetland.dm" -#include "code\game\MapData\shuttles\independent_shetland.dm" #include "code\game\MapData\shuttles\misc.dm" #include "code\game\MapData\shuttles\pgf_bolide.dm" #include "code\game\MapData\shuttles\pgf_crying_sun.dm" @@ -3826,6 +3825,10 @@ #include "modular_starfly\modules\admin_verb_freeze\overlays.dm" #include "modular_starfly\modules\cryosleep_symptoms\cryopod.dm" #include "modular_starfly\modules\cryosleep_symptoms\game_options.dm" +#include "modular_starfly\modules\desert-resources\code\game\objects\structures\flora.dm" +#include "modular_starfly\modules\desert-resources\code\game\objects\structures\signs\signs_flags.dm" +#include "modular_starfly\modules\desert-resources\code\modules\mob\living\simple_animal\friendly\moghes.dm" +#include "modular_starfly\modules\desert-resources\code\modules\power\lighting.dm" #include "modular_starfly\modules\new_wearables\contraband.dm" #include "modular_starfly\modules\new_wearables\loadout_accessories.dm" #include "modular_starfly\modules\new_wearables\loadout_hat.dm" diff --git a/tools/starfly/ci/lint.sh b/tools/starfly/ci/lint.sh index 273da0895c..8b83af7a05 100755 --- a/tools/starfly/ci/lint.sh +++ b/tools/starfly/ci/lint.sh @@ -11,6 +11,9 @@ echo "# Checking shiptest.dme" echo "## Checking FILE_DIR directives in shiptest.dme" tools/starfly/ci/check_file_dir.sh +echo "## Checking include types in shiptest.dme" +python3 tools/starfly/python/check_dme_includes.py shiptest.dme + echo "## Checking include order in shiptest.dme" python3 tools/starfly/python/check_dme_order.py shiptest.dme diff --git a/tools/starfly/python/check_dme_includes.py b/tools/starfly/python/check_dme_includes.py new file mode 100755 index 0000000000..989783c9e8 --- /dev/null +++ b/tools/starfly/python/check_dme_includes.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# check_dme_includes.py +# Copyright 2026 Patrick Meade. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +#---------------------------------------------------------------------------- + +import sys +from pathlib import Path + +EXPECTED_SUFFIXES = [".dm", ".dmf"] + +def get_includes(file_path): + with open(file_path, 'r') as file: + lines = file.readlines() + + includes = [line for line in lines if line.strip().startswith('#include')] + paths = [line.split('#include')[1].strip().strip('"') for line in includes] + return paths + +def check_dme_include_types(file_path): + # until we know otherwise, all the path suffixes are legitimate + all_good = True + + # get all of the include paths from the .dme file + paths = get_includes(file_path) + + # for each include path in the dme file + for include_path_str in paths: + # turn it into a python Path object + include_path = Path(include_path_str) + + # if the path suffix is NOT one of the ones we expect + if include_path.suffix not in EXPECTED_SUFFIXES: + # set the all_good flag to False + all_good = False + # tell the user what we found + print(f'#include "{include_path_str}" has suffix "{include_path.suffix}"') + + # if we found an error + if not all_good: + print(f"Some #include paths in {file_path} are a little sus.") + + # return our result to ther caller + return all_good + + +if __name__ == "__main__": + file_path = sys.argv[1] + if not check_dme_include_types(file_path): + sys.exit(1) + else: + print("All #include paths have suffixes we expected.")