diff --git a/.gitignore b/.gitignore index 9d2b3ae5aa14..b7e92fbae535 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # ignore misc BYOND files -Thumbs.db *.log *.int *.rsc @@ -21,6 +20,11 @@ atupdate config/* sql/test_db +# misc OS garbage +Thumbs.db +Thumbs.db:encryptable +.DS_Store + # vscode .vscode/* *.code-workspace diff --git a/code/__defines/ai.dm b/code/__defines/ai.dm index 2123e2e8839b..03fa03fa9e88 100644 --- a/code/__defines/ai.dm +++ b/code/__defines/ai.dm @@ -6,6 +6,8 @@ #define STANCE_ATTACKING /decl/mob_controller_stance/attacking #define STANCE_TIRED /decl/mob_controller_stance/tired #define STANCE_CONTAINED /decl/mob_controller_stance/contained +#define STANCE_BUSY /decl/mob_controller_stance/busy + //basically 'do nothing' #define STANCE_COMMANDED_STOP /decl/mob_controller_stance/commanded/stop //follows a target diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 9493ae7aa125..94c9d41639ae 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -33,26 +33,11 @@ #define DEFAULT_TELECRYSTAL_AMOUNT 130 #define IMPLANT_TELECRYSTAL_AMOUNT(x) (round(x * 0.49)) // If this cost is ever greater than half of DEFAULT_TELECRYSTAL_AMOUNT then it is possible to buy more TC than you spend -///////////////// -////WIZARD ////// -///////////////// +// SPELL FLAGS +#define Z2NOCAST BITFLAG(0) //if this is added, the spell can't be cast at centcomm +#define INCLUDEUSER BITFLAG(1) //does the spell include the caster in its target selection? +#define IGNOREDENSE BITFLAG(2) //are dense turfs ignored in selection? -/* WIZARD SPELL FLAGS */ -#define GHOSTCAST BITFLAG(0) //can a ghost cast it? -#define NEEDSCLOTHES BITFLAG(1) //does it need the wizard garb to cast? Nonwizard spells should not have this -#define NEEDSHUMAN BITFLAG(2) //does it require the caster to be human? -#define Z2NOCAST BITFLAG(3) //if this is added, the spell can't be cast at centcomm -#define NO_SOMATIC BITFLAG(4) //spell will go off if the person is incapacitated or stunned -#define IGNOREPREV BITFLAG(5) //if set, each new target does not overlap with the previous one -//The following flags only affect different types of spell, and therefore overlap -//Targeted spells -#define INCLUDEUSER BITFLAG(6) //does the spell include the caster in its target selection? -#define SELECTABLE BITFLAG(7) //can you select each target for the spell? -#define NOFACTION BITFLAG(8) //Don't do the same as our faction -#define NONONFACTION BITFLAG(9) //Don't do people other than our faction -//AOE spells -#define IGNOREDENSE BITFLAG(10) //are dense turfs ignored in selection? -#define IGNORESPACE BITFLAG(11) //are space turfs ignored in selection? //End split flags #define CONSTRUCT_CHECK BITFLAG(12) //used by construct spells - checks for nullrods #define NO_BUTTON BITFLAG(13) //spell won't show up in the HUD with this diff --git a/code/__defines/structures.dm b/code/__defines/structures.dm index f91ed7aed08f..39849cecebc9 100644 --- a/code/__defines/structures.dm +++ b/code/__defines/structures.dm @@ -1 +1,4 @@ -#define STRUCTURE_FLAG_SURFACE BITFLAG(0) \ No newline at end of file +// Structure counts as a surface for the purposes of placing items on. +#define STRUCTURE_FLAG_SURFACE BITFLAG(0) +// Structure takes damage from thrown objects colliding with it. +#define STRUCTURE_FLAG_THROWN_DAMAGE BITFLAG(1) \ No newline at end of file diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index fc69009e88b8..cd44840622aa 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -39,6 +39,7 @@ #define SS_PRIORITY_GHOST_IMAGES 10 // Updates ghost client images. #define SS_PRIORITY_ZCOPY 10 // Builds appearances for Z-Mimic. #define SS_PRIORITY_PROJECTILES 10 // Projectile processing! +#define SS_PRIORITY_PATHFINDING 10 // Processing pathfinding requests // SS_BACKGROUND #define SS_PRIORITY_OBJECTS 100 // processing_objects processing. diff --git a/code/__defines/topic.dm b/code/__defines/topic.dm index 74e2ca005f07..219abf3728e4 100644 --- a/code/__defines/topic.dm +++ b/code/__defines/topic.dm @@ -2,6 +2,8 @@ #define TOPIC_HANDLED BITFLAG(0) #define TOPIC_REFRESH BITFLAG(1) #define TOPIC_UPDATE_PREVIEW BITFLAG(2) - // use to force a browse() call, unblocking some rsc operations +/// Return this to force a browse() call, unblocking some rsc operations #define TOPIC_HARD_REFRESH BITFLAG(3) +/// Return this to indicate the window associated with this Topic() call should be closed. +#define TOPIC_CLOSE BITFLAG(4) #define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_HARD_REFRESH|TOPIC_UPDATE_PREVIEW) diff --git a/code/__globals.dm b/code/__globals.dm index 12434ad8011c..7c9e5ed5dbea 100644 --- a/code/__globals.dm +++ b/code/__globals.dm @@ -1,15 +1,15 @@ // Defined here due to being used immediately below. #define GET_DECL(D) (ispath(D, /decl) ? (decls_repository.fetched_decls[D] || decls_repository.get_decl(D)) : null) +#define IMPLIED_DECL GET_DECL(__IMPLIED_TYPE__) // Defined here due to compile order; overrides in macros make the compiler complain. /decl/global_vars var/static/list/protected_vars = list("protected_vars") // No editing the protected list! +/decl/global_vars/Initialize() + . = ..() + mark_protected_vars() /decl/global_vars/proc/mark_protected_vars() return -/hook/startup/proc/mark_protected_vars() - var/decl/global_vars/global_vars = GET_DECL(/decl/global_vars) - global_vars.mark_protected_vars() - return TRUE #define GLOBAL_GETTER(NAME, TYPE, VAL) \ var/global##TYPE/##NAME; \ diff --git a/code/_global_vars/lists/flavor.dm b/code/_global_vars/lists/flavor.dm index ccf00b40b7e2..b2096edc0a4f 100644 --- a/code/_global_vars/lists/flavor.dm +++ b/code/_global_vars/lists/flavor.dm @@ -115,15 +115,13 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) /proc/SetupCableColors() . = list() - var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - for(var/ctype in list( + var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - typesof( /obj/item/stack/cable_coil/single, /obj/item/stack/cable_coil/cut, /obj/item/stack/cable_coil/cyborg, /obj/item/stack/cable_coil/fabricator, /obj/item/stack/cable_coil/random - )) - valid_cable_coils -= typesof(ctype) + ) var/special_name_mappings = list(/obj/item/stack/cable_coil = "Red") for(var/coil_type in valid_cable_coils) @@ -132,6 +130,6 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) var/obj/item/stack/cable_coil/C = coil_type if(!initial(C.can_have_color)) continue - var/color = initial(C.color) + var/color = initial(C.paint_color) || initial(C.color) .[name] = color . = sortTim(., /proc/cmp_text_asc) diff --git a/code/_global_vars/lists/jewellery.dm b/code/_global_vars/lists/jewellery.dm new file mode 100644 index 000000000000..7364bff8b607 --- /dev/null +++ b/code/_global_vars/lists/jewellery.dm @@ -0,0 +1,23 @@ +var/global/list/random_jewellery_material_types = list( + /decl/material/solid/metal/gold, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/copper, + /decl/material/solid/metal/platinum, + /decl/material/solid/metal/steel, + /decl/material/solid/organic/bone, + /decl/material/solid/organic/wood +) +var/global/list/random_jewellery_gem_types = list( + /obj/item/gemstone/baguette/topaz, + /obj/item/gemstone/baguette/sapphire, + /obj/item/gemstone/baguette/ruby, + /obj/item/gemstone/hexagon/topaz, + /obj/item/gemstone/hexagon/sapphire, + /obj/item/gemstone/hexagon/ruby, + /obj/item/gemstone/octagon/topaz, + /obj/item/gemstone/octagon/sapphire, + /obj/item/gemstone/octagon/ruby, + /obj/item/gemstone/round/topaz, + /obj/item/gemstone/round/sapphire, + /obj/item/gemstone/round/ruby +) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index f3379f84c524..84463762e677 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -62,7 +62,7 @@ var/global/list/string_slot_flags = list( . = new /mob/living/human/dummy/mannequin() mannequins_[ckey] = . -/hook/global_init/proc/makeDatumRefLists() +/proc/makeDatumRefLists() // Keybindings for(var/KB in subtypesof(/datum/keybinding)) var/datum/keybinding/keybinding = KB diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index eea2b9b3833f..a59873ee3308 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -72,10 +72,6 @@ var/global/next_duration_update = 0 var/global/last_round_duration = 0 var/global/round_start_time = 0 -/hook/roundstart/proc/start_timer() - round_start_time = world.time - return 1 - /proc/ticks2readable(tick_time) var/hours = round(tick_time / (1 HOUR)) var/minutes = round((tick_time % (1 HOUR)) / (1 MINUTE)) @@ -109,10 +105,6 @@ var/global/round_start_time = 0 next_duration_update = world.time + 1 MINUTES return last_round_duration -/hook/startup/proc/set_roundstart_hour() - roundstart_hour = rand(0, 23) - return TRUE - var/global/midnight_rollovers = 0 var/global/rollovercheck_last_timeofday = 0 /proc/update_midnight_rollover() diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 657d9e500352..45dc05bd2c83 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -169,8 +169,10 @@ Turf and target are seperate in case you want to teleport some distance from a t return 1 return 0 +#if DM_VERSION < 516 /proc/sign(x) return x!=0?x/abs(x):0 +#endif /proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm var/px=M.x //starting x diff --git a/code/_helpers/washing.dm b/code/_helpers/washing.dm index 487afbd8700e..0bb0169a3d1a 100644 --- a/code/_helpers/washing.dm +++ b/code/_helpers/washing.dm @@ -2,8 +2,8 @@ if(!istype(washing)) return var/mob/living/L = washing - if(L.on_fire) + if(L.is_on_fire()) L.visible_message("A cloud of steam rises up as the water hits \the [L]!") - L.ExtinguishMob() - L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily + L.extinguish_fire() + L.adjust_fire_intensity(-20) //Douse ourselves with water to avoid fire more easily washing.clean() diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e35ab0ceb7e0..56e4ee39cc83 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -60,7 +60,7 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) return A.add_hiddenprint(src) @@ -118,10 +118,10 @@ I have no idea why it was in atoms.dm instead of respective files. */ -/atom/proc/AICtrlAltClick() +/atom/proc/AICtrlAltClick(mob/living/silicon/user) -/obj/machinery/door/airlock/AICtrlAltClick() // Electrifies doors. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlAltClick(mob/living/silicon/user) // Electrifies doors. + if(user.incapacitated()) return if(!electrified_until) // permanent shock @@ -131,14 +131,14 @@ Topic(src, list("command"="electrify_permanently", "activate" = "0")) return 1 -/atom/proc/AICtrlShiftClick() +/atom/proc/AICtrlShiftClick(mob/living/silicon/user) return -/atom/proc/AIShiftClick() +/atom/proc/AIShiftClick(mob/living/silicon/user) return -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIShiftClick(mob/living/silicon/user) // Opens and closes doors! + if(user.incapacitated()) return if(density) Topic(src, list("command"="open", "activate" = "1")) @@ -146,11 +146,11 @@ Topic(src, list("command"="open", "activate" = "0")) return 1 -/atom/proc/AICtrlClick() +/atom/proc/AICtrlClick(mob/living/silicon/user) return FALSE -/obj/machinery/door/airlock/AICtrlClick() // Bolts doors - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlClick(mob/living/silicon/user) // Bolts doors + if(user.incapacitated()) return FALSE if(locked) Topic(src, list("command"="bolts", "activate" = "0")) @@ -158,35 +158,35 @@ Topic(src, list("command"="bolts", "activate" = "1")) return TRUE -/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - if(usr.incapacitated()) +/obj/machinery/power/apc/AICtrlClick(mob/living/silicon/user) // turns off/on APCs. + if(user.incapacitated()) return FALSE Topic(src, list("breaker"="1")) return TRUE -/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AICtrlClick(mob/living/silicon/user) //turns off/on Turrets + if(user.incapacitated()) return FALSE Topic(src, list("command"="enable", "value"="[!enabled]")) return TRUE -/atom/proc/AIAltClick(var/atom/A) - return AltClick(A) +/atom/proc/AIAltClick(mob/living/silicon/user) + return AltClick(user) -/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AIAltClick(mob/living/silicon/user) //toggles lethal on turrets + if(user.incapacitated()) return Topic(src, list("command"="lethal", "value"="[!lethal]")) return 1 -/obj/machinery/atmospherics/binary/pump/AIAltClick() - return AltClick() +/obj/machinery/atmospherics/binary/pump/AIAltClick(mob/living/silicon/user) + return AltClick(user) /atom/proc/AIMiddleClick(var/mob/living/silicon/user) return 0 -/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIMiddleClick(mob/living/silicon/user) // Toggles door bolt lights. + if(user.incapacitated()) return if(..()) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 5be9c8e94478..8c32d898a185 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -108,7 +108,7 @@ if(holding == A) // Handle attack_self holding.attack_self(src) trigger_aiming(TARGET_CAN_CLICK) - usr.update_inhand_overlays(FALSE) + update_inhand_overlays(FALSE) return 1 //Atoms on your person @@ -124,10 +124,10 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) @@ -151,10 +151,10 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 695fbe49f205..2ad7f9d7c98f 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -42,9 +42,9 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() if(is_component_functioning("camera")) - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) else - to_chat(src, "Your camera isn't functional.") + to_chat(src, SPAN_DANGER("Your camera isn't functional.")) return var/obj/item/holding = get_active_held_item() @@ -69,7 +69,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return if(!isturf(loc)) @@ -81,7 +81,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else holding.afterattack(A, src, 0, params) return @@ -111,42 +111,39 @@ /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick() - AICtrlShiftClick() +/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code. - AIShiftClick() +/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden return CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code. - return AICtrlClick() +/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code. - return AICtrlClick() +/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code. - return AICtrlClick() +/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + return AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code. - if (!usr.check_intent(I_FLAG_HELP)) - AICtrlAltClick() +/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + if (!user.check_intent(I_FLAG_HELP)) + AICtrlAltClick(user) else ..() -/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. - AIAltClick() - -/obj/machinery/atmospherics/binary/pump/BorgAltClick() - return AltClick() +/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + AIAltClick(user) /atom/proc/BorgCtrlAltClick(var/mob/living/silicon/robot/user) CtrlAltClick(user) diff --git a/code/_onclick/ghost.dm b/code/_onclick/ghost.dm index da5d187674d6..7bee520bdb59 100644 --- a/code/_onclick/ghost.dm +++ b/code/_onclick/ghost.dm @@ -45,6 +45,9 @@ return if(user.client && user.client.inquisitive_ghost) user.examinate(src) + return + if(user.client?.holder || user.antagHUD) + storage?.show_to(user) return // --------------------------------------- diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index dbd392509b6a..e122262cdb96 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -78,7 +78,7 @@ Deactivate() if(AB_GENERIC) if(target && procname) - call(target,procname)(usr) + call(target,procname)(owner) return /datum/action/proc/Activate() diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 6408ee430382..2243f9e49232 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -96,11 +96,11 @@ var/global/obj/screen/robot_inventory R.active_storage.close(R) //Closes the inventory ui. if(!R.module) - to_chat(usr, SPAN_WARNING("No module selected.")) + to_chat(R, SPAN_WARNING("No module selected.")) return if(!R.module.equipment) - to_chat(usr, SPAN_WARNING("Selected module has no equipment available.")) + to_chat(R, SPAN_WARNING("Selected module has no equipment available.")) return if(!R.robot_modules_background) diff --git a/code/_onclick/hud/screen/screen_abilities.dm b/code/_onclick/hud/screen/screen_abilities.dm index 03961a964233..414458af058e 100644 --- a/code/_onclick/hud/screen/screen_abilities.dm +++ b/code/_onclick/hud/screen/screen_abilities.dm @@ -195,7 +195,6 @@ if(object) object.Click() -// Wizard /obj/screen/ability/spell var/spell/spell var/spell_base @@ -223,10 +222,7 @@ A.SetName(spell.name) if(!spell.override_base) //if it's not set, we do basic checks - if(spell.spell_flags & CONSTRUCT_CHECK) - A.spell_base = "const" //construct spells - else - A.spell_base = "wiz" //wizard spells + A.spell_base = "const" //construct spells else A.spell_base = spell.override_base A.update_charge(1) diff --git a/code/_onclick/hud/screen/screen_ai_button.dm b/code/_onclick/hud/screen/screen_ai_button.dm index 03371223da7a..a7f2861002f3 100644 --- a/code/_onclick/hud/screen/screen_ai_button.dm +++ b/code/_onclick/hud/screen/screen_ai_button.dm @@ -8,9 +8,9 @@ var/image/template_undelay /obj/screen/ai_button/handle_click(mob/user, params) - if(!isAI(usr)) + if(!isAI(user)) return TRUE - var/mob/living/silicon/ai/A = usr + var/mob/living/silicon/ai/A = user if(!(ai_verb in A.verbs)) return TRUE diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm index 997fe5683bc1..39ca9349ad81 100644 --- a/code/_onclick/hud/screen/screen_equip.dm +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -3,6 +3,6 @@ icon_state = "act_equip" /obj/screen/equip/handle_click(mob/user, params) - if(ishuman(usr)) - var/mob/living/human/H = usr + if(ishuman(user)) + var/mob/living/human/H = user H.quick_equip() diff --git a/code/_onclick/hud/screen/screen_exosuit.dm b/code/_onclick/hud/screen/screen_exosuit.dm index 565de7e3644e..5677d2d93bcb 100644 --- a/code/_onclick/hud/screen/screen_exosuit.dm +++ b/code/_onclick/hud/screen/screen_exosuit.dm @@ -340,19 +340,19 @@ toggled = owner.head.active_sensors . = ..() -/obj/screen/exosuit/toggle/camera/toggled() +/obj/screen/exosuit/toggle/camera/toggled(mob/user) var/mob/living/exosuit/owner = get_owning_exosuit() if(!istype(owner) || !owner.head) - to_chat(usr, SPAN_WARNING("I/O Error: Camera systems not found.")) + to_chat(user, SPAN_WARNING("I/O Error: Camera systems not found.")) return if(!owner.head.vision_flags) - to_chat(usr, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) + to_chat(user, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) return if(!owner.get_cell()) - to_chat(usr, SPAN_WARNING("The augmented vision systems are offline.")) + to_chat(user, SPAN_WARNING("The augmented vision systems are offline.")) return owner.head.active_sensors = ..() - to_chat(usr, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) + to_chat(user, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) /obj/screen/exosuit/needle vis_flags = VIS_INHERIT_ID diff --git a/code/_onclick/hud/screen/screen_inventory.dm b/code/_onclick/hud/screen/screen_inventory.dm index 4033741be782..5bacceaeef04 100644 --- a/code/_onclick/hud/screen/screen_inventory.dm +++ b/code/_onclick/hud/screen/screen_inventory.dm @@ -55,7 +55,7 @@ // Mark anything we're potentially trying to equip. var/obj/item/mouse_over_atom = mouse_over_atom_ref?.resolve() - if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !usr.get_equipped_item(slot_id)) + if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !owner.get_equipped_item(slot_id)) var/mutable_appearance/MA = new /mutable_appearance(mouse_over_atom) MA.layer = HUD_ABOVE_ITEM_LAYER MA.plane = HUD_PLANE diff --git a/code/_onclick/hud/screen/screen_needs.dm b/code/_onclick/hud/screen/screen_needs.dm index eaa8d41ed3e8..8a4c66ca08b9 100644 --- a/code/_onclick/hud/screen/screen_needs.dm +++ b/code/_onclick/hud/screen/screen_needs.dm @@ -12,15 +12,15 @@ if(user.nutrition_icon == src) switch(icon_state) if("nutrition0") - to_chat(usr, SPAN_WARNING("You are completely stuffed.")) + to_chat(user, SPAN_WARNING("You are completely stuffed.")) if("nutrition1") - to_chat(usr, SPAN_NOTICE("You are not hungry.")) + to_chat(user, SPAN_NOTICE("You are not hungry.")) if("nutrition2") - to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) + to_chat(user, SPAN_NOTICE("You are a bit peckish.")) if("nutrition3") - to_chat(usr, SPAN_WARNING("You are quite hungry.")) + to_chat(user, SPAN_WARNING("You are quite hungry.")) if("nutrition4") - to_chat(usr, SPAN_DANGER("You are starving!")) + to_chat(user, SPAN_DANGER("You are starving!")) /obj/screen/drink name = "hydration" @@ -32,15 +32,15 @@ if(user.hydration_icon == src) switch(icon_state) if("hydration0") - to_chat(usr, SPAN_WARNING("You are overhydrated.")) + to_chat(user, SPAN_WARNING("You are overhydrated.")) if("hydration1") - to_chat(usr, SPAN_NOTICE("You are not thirsty.")) + to_chat(user, SPAN_NOTICE("You are not thirsty.")) if("hydration2") - to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) + to_chat(user, SPAN_NOTICE("You are a bit thirsty.")) if("hydration3") - to_chat(usr, SPAN_WARNING("You are quite thirsty.")) + to_chat(user, SPAN_WARNING("You are quite thirsty.")) if("hydration4") - to_chat(usr, SPAN_DANGER("You are dying of thirst!")) + to_chat(user, SPAN_DANGER("You are dying of thirst!")) /obj/screen/bodytemp name = "body temperature" @@ -52,23 +52,23 @@ if(user.bodytemp == src) switch(icon_state) if("temp4") - to_chat(usr, SPAN_DANGER("You are being cooked alive!")) + to_chat(user, SPAN_DANGER("You are being cooked alive!")) if("temp3") - to_chat(usr, SPAN_DANGER("Your body is burning up!")) + to_chat(user, SPAN_DANGER("Your body is burning up!")) if("temp2") - to_chat(usr, SPAN_DANGER("You are overheating.")) + to_chat(user, SPAN_DANGER("You are overheating.")) if("temp1") - to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) + to_chat(user, SPAN_WARNING("You are uncomfortably hot.")) if("temp-4") - to_chat(usr, SPAN_DANGER("You are being frozen solid!")) + to_chat(user, SPAN_DANGER("You are being frozen solid!")) if("temp-3") - to_chat(usr, SPAN_DANGER("You are freezing cold!")) + to_chat(user, SPAN_DANGER("You are freezing cold!")) if("temp-2") - to_chat(usr, SPAN_WARNING("You are dangerously chilled!")) + to_chat(user, SPAN_WARNING("You are dangerously chilled!")) if("temp-1") - to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) + to_chat(user, SPAN_NOTICE("You are uncomfortably cold.")) else - to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) + to_chat(user, SPAN_NOTICE("Your body is at a comfortable temperature.")) /obj/screen/pressure name = "pressure" @@ -80,15 +80,15 @@ if(user.pressure == src) switch(icon_state) if("pressure2") - to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) + to_chat(user, SPAN_DANGER("The air pressure here is crushing!")) if("pressure1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously high.")) if("pressure-1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously low.")) if("pressure-2") - to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) + to_chat(user, SPAN_DANGER("There is nearly no air pressure here!")) else - to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) + to_chat(user, SPAN_NOTICE("The local air pressure is comfortable.")) /obj/screen/toxins name = "toxin" @@ -99,9 +99,9 @@ /obj/screen/toxins/handle_click(mob/user, params) if(user.toxin == src) if(icon_state == "tox0") - to_chat(usr, SPAN_NOTICE("The air is clear of toxins.")) + to_chat(user, SPAN_NOTICE("The air is clear of toxins.")) else - to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) + to_chat(user, SPAN_DANGER("The air is eating away at your skin!")) /obj/screen/oxygen name = "oxygen" @@ -112,6 +112,6 @@ /obj/screen/oxygen/handle_click(mob/user, params) if(user.oxygen == src) if(icon_state == "oxy0") - to_chat(usr, SPAN_NOTICE("You are breathing easy.")) + to_chat(user, SPAN_NOTICE("You are breathing easy.")) else - to_chat(usr, SPAN_DANGER("You cannot breathe!")) + to_chat(user, SPAN_DANGER("You cannot breathe!")) diff --git a/code/_onclick/hud/screen/screen_pai.dm b/code/_onclick/hud/screen/screen_pai.dm index 7059432c1a76..51ceb9d7c27e 100644 --- a/code/_onclick/hud/screen/screen_pai.dm +++ b/code/_onclick/hud/screen/screen_pai.dm @@ -68,7 +68,7 @@ /obj/screen/pai/subsystems/handle_click(mob/user, params) var/mob/living/silicon/pai/pai = user if(istype(pai)) - var/ss_name = input(usr, "Activates the given subsystem", "Subsystems", "") in pai.silicon_subsystems_by_name + var/ss_name = input(user, "Activates the given subsystem", "Subsystems", "") in pai.silicon_subsystems_by_name if (!ss_name) return var/stat_silicon_subsystem/SSS = pai.silicon_subsystems_by_name[ss_name] diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index a3e8714eaffe..1dbed7ab122e 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -48,7 +48,7 @@ avoid code duplication. This includes items that may sometimes act as a standard // Return TRUE if further actions (afterattack, etc) should be prevented, FALSE if they can proceed. /atom/movable/proc/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.check_intent(I_FLAG_HELP)) + if(isliving(user) && !user.check_intent(I_FLAG_HARM)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 870865a831ff..6debf2726ddb 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -66,9 +66,9 @@ var/obj/item/organ/external/hand/O = GET_EXTERNAL_ORGAN(src, get_active_held_item_slot()) if(!istype(O)) return FALSE - var/decl/pronouns/G = get_pronouns() + var/decl/pronouns/pronouns = get_pronouns() visible_message( - SPAN_DANGER("\The [src] chews on [G.his] [O.name]"), + SPAN_DANGER("\The [src] chews on [pronouns.his] [O.name]"), SPAN_DANGER("You chew on your [O.name]!") ) admin_attacker_log(src, "chewed on their [O.name]!") diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 9c1802edd7a6..3b7d5f0d8ac1 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -46,6 +46,6 @@ return 0 rig.selected_module.engage(A, alert_ai) if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return 1 return 0 \ No newline at end of file diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 4e599b93113c..d91f03f89eed 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -123,11 +123,7 @@ var/global/list/all_selectable_radio_filters = list( RADIO_MAGNETS ) -var/global/datum/controller/radio/radio_controller - -/hook/startup/proc/createRadioController() - radio_controller = new /datum/controller/radio() - return 1 +var/global/datum/controller/radio/radio_controller = new /datum/controller/radio() //callback used by objects to react to incoming radio signals /obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) diff --git a/code/controllers/evacuation/evacuation.dm b/code/controllers/evacuation/evacuation.dm index 69eeb9bc5bce..90849e6e1935 100644 --- a/code/controllers/evacuation/evacuation.dm +++ b/code/controllers/evacuation/evacuation.dm @@ -131,8 +131,6 @@ evac_waiting.Announce(replacetext(global.using_map.emergency_shuttle_docked_message, "%ETD%", "[estimated_time] minute\s"), new_sound = sound('sound/effects/Evacuation.ogg', volume = 35)) else priority_announcement.Announce(replacetext(replacetext(global.using_map.shuttle_docked_message, "%dock_name%", "[global.using_map.dock_name]"), "%ETD%", "[estimated_time] minute\s")) - if(get_config_value(/decl/config/toggle/announce_shuttle_dock_to_irc)) - send2mainirc("The shuttle has docked with the station. It will depart in approximately [estimated_time] minute\s.") /datum/evacuation_controller/proc/launch_evacuation() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm deleted file mode 100644 index 696352c85eb0..000000000000 --- a/code/controllers/hooks-defs.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Global init hook. - * Called in global_init.dm when the server is initialized. - */ -/hook/global_init - -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in ticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in ticker.dm when a round ends. - */ -/hook/roundend - -/** - * Shutdown hook. - * Called in world.dm when world/Del is called. - */ -/hook/shutdown - -/** - * Reboot hook. - * Called in world.dm prior to the parent call in world/Reboot. - */ -/hook/reboot diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm deleted file mode 100644 index 2e05a0621b0f..000000000000 --- a/code/controllers/hooks.dm +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file hooks.dm - * Implements hooks, a simple way to run code on pre-defined events. - */ - -/** @page hooks Code hooks - * @section hooks Hooks - * A hook is defined under /hook in the type tree. - * - * To add some code to be called by the hook, define a proc under the type, as so: - * @code - hook/foo/proc/bar() - if(1) - return 1 //Sucessful - else - return 0 //Error, or runtime. - * @endcode - * All hooks must return nonzero on success, as runtimes will force return null. - */ - -/** - * Calls a hook, executing every piece of code that's attached to it. - * @param hook Identifier of the hook to call. - * @returns 1 if all hooked code runs successfully, 0 otherwise. - */ -/proc/callHook(hook, list/args=null) - var/hook_path = text2path("/hook/[hook]") - if(!hook_path) - error("Invalid hook '/hook/[hook]' called.") - return 0 - - var/caller = new hook_path - var/status = 1 - for(var/P in typesof("[hook_path]/proc")) - if(!call(caller, P)(arglist(args))) - error("Hook '[P]' failed or runtimed.") - status = 0 - - return status diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm index 4e3819c4b560..5fad4ec549cb 100644 --- a/code/controllers/subsystems/initialization/modpacks.dm +++ b/code/controllers/subsystems/initialization/modpacks.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(modpacks) // Update compiled infolists and apply. default_submap_whitelisted_species |= global.using_map.default_species - for(var/decl/submap_archetype/submap in decls_repository.get_decls_of_type_unassociated(/decl/submap_archetype)) + for(var/decl/submap_archetype/submap in global.using_map.get_available_submap_archetypes()) if(islist(submap.whitelisted_species) && !length(submap.whitelisted_species)) submap.whitelisted_species |= SSmodpacks.default_submap_whitelisted_species if(islist(submap.blacklisted_species) && !length(submap.blacklisted_species)) diff --git a/code/controllers/subsystems/initialization/webhooks.dm b/code/controllers/subsystems/initialization/webhooks.dm index 14c560979d41..c773998c9ba5 100644 --- a/code/controllers/subsystems/initialization/webhooks.dm +++ b/code/controllers/subsystems/initialization/webhooks.dm @@ -46,6 +46,9 @@ SUBSYSTEM_DEF(webhooks) else to_world_log("Failed to set up webhook [wid].") +/datum/controller/subsystem/webhooks/proc/is_webhook_configured(wid) + return isnull(webhook_decls[wid]) + /datum/controller/subsystem/webhooks/proc/send(var/wid, var/wdata) var/decl/webhook/webhook = webhook_decls[wid] if(webhook) @@ -88,7 +91,3 @@ SUBSYSTEM_DEF(webhooks) log_and_message_admins("has pinged webhook [choice].", usr) to_world_log("[usr.key] has pinged webhook [choice].") webhook.send() - -/hook/roundstart/proc/run_webhook() - SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) - return 1 diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index b900dcf8c32d..58e71e52d0d1 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -45,9 +45,9 @@ SUBSYSTEM_DEF(jobs) // Create abstract submap archetype jobs for use in prefs, etc. archetype_job_datums.Cut() - var/list/submap_archetypes = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/atype in submap_archetypes) - var/decl/submap_archetype/arch = submap_archetypes[atype] + var/list/submap_archetypes = list() + for(var/decl/submap_archetype/arch as anything in global.using_map.get_available_submap_archetypes()) + submap_archetypes += arch for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(!job && ispath(jobtype, /datum/job/submap)) @@ -57,7 +57,8 @@ SUBSYSTEM_DEF(jobs) job = get_by_path(jobtype) if(job) archetype_job_datums |= job - submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc, TRUE) + if(length(submap_archetypes)) + submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc) // Load job configuration (is this even used anymore?) if(job_config_file && get_config_value(/decl/config/toggle/load_jobs_from_txt)) @@ -90,16 +91,15 @@ SUBSYSTEM_DEF(jobs) primary_job_datums = sortTim(primary_job_datums, /proc/cmp_job_desc) job_lists_by_map_name = list("[global.using_map.full_name]" = list("jobs" = primary_job_datums, "default_to_hidden" = FALSE)) - for(var/atype in submap_archetypes) + for(var/decl/submap_archetype/arch as anything in submap_archetypes) var/list/submap_job_datums - var/decl/submap_archetype/arch = submap_archetypes[atype] for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(job) LAZYADD(submap_job_datums, job) if(LAZYLEN(submap_job_datums)) submap_job_datums = sortTim(submap_job_datums, /proc/cmp_job_desc) - job_lists_by_map_name[arch.descriptor] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) + job_lists_by_map_name[arch.name] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) // Update global map blacklists and whitelists. for(var/mappath in global.all_maps) diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index daf0a7a44df8..a7583ae1b2ff 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -40,17 +40,12 @@ SUBSYSTEM_DEF(lighting) ) ..(out.Join()) -#ifdef USE_INTELLIGENT_LIGHTING_UPDATES - -/hook/roundstart/proc/lighting_init_roundstart() - SSlighting.handle_roundstart() - return TRUE - +// If intelligent updates are off, this is just an empty stub. /datum/controller/subsystem/lighting/proc/handle_roundstart() +#ifdef USE_INTELLIGENT_LIGHTING_UPDATES force_queued = FALSE total_ss_updates = 0 total_instant_updates = 0 - #endif /datum/controller/subsystem/lighting/Initialize(timeofday) diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index ecc1ad88b1ed..6e1061636ec6 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -426,7 +426,3 @@ SUBSYSTEM_DEF(mapping) if(!P) continue P.begin_processing() - -/hook/roundstart/proc/start_processing_all_planets() - SSmapping.start_processing_all_planets() - return TRUE diff --git a/code/controllers/subsystems/mob_ai/auto_movement.dm b/code/controllers/subsystems/mob_ai/auto_movement.dm index 7e2990c1cb8d..843f37ab2d05 100644 --- a/code/controllers/subsystems/mob_ai/auto_movement.dm +++ b/code/controllers/subsystems/mob_ai/auto_movement.dm @@ -51,5 +51,8 @@ SUBSYSTEM_DEF(automove) if(controller.handle_mover(mover, moving_metadata[mover]) == PROCESS_KILL && !QDELETED(mover)) mover.stop_automove() if(MC_TICK_CHECK) - processing_atoms.Cut(1, i+1) + if(i >= length(processing_atoms)) + processing_atoms.Cut() + else + processing_atoms.Cut(1, i+1) return diff --git a/code/controllers/subsystems/pathfinding.dm b/code/controllers/subsystems/pathfinding.dm new file mode 100644 index 000000000000..d6e63f4191f1 --- /dev/null +++ b/code/controllers/subsystems/pathfinding.dm @@ -0,0 +1,123 @@ +SUBSYSTEM_DEF(pathfinding) + name = "Pathfinding" + priority = SS_PRIORITY_PATHFINDING + init_order = SS_INIT_MISC_LATE + wait = 1 + + var/list/pending = list() + var/list/processing = list() + var/list/mover_metadata = list() + + VAR_PRIVATE/static/_default_adjacency_call = TYPE_PROC_REF(/turf, CardinalTurfsWithAccess) + VAR_PRIVATE/static/_default_distance_call = TYPE_PROC_REF(/turf, Distance) + +/atom/movable + var/waiting_for_path + +/atom/movable/proc/path_found(list/path) + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/atom/movable/proc/path_not_found() + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/datum/controller/subsystem/pathfinding/proc/dequeue_mover(atom/movable/mover, include_processing = TRUE) + if(!istype(mover)) + return + mover.waiting_for_path = null + pending -= mover + mover_metadata -= mover + if(include_processing) + processing -= mover + +// Hook to allow legacy use of AStar* to reuse the callback refs +/datum/controller/subsystem/pathfinding/proc/find_path_immediate(start, end, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + return find_path_astar(start, end, _default_adjacency_call, _default_distance_call, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick) + +/datum/controller/subsystem/pathfinding/proc/enqueue_mover(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata) + if(!istype(mover) || mover.waiting_for_path) + return FALSE + if(!istype(target)) + return FALSE + pending |= mover + pending[mover] = target + if(istype(metadata)) + mover_metadata[mover] = metadata + mover.waiting_for_path = world.time + return TRUE + +/datum/controller/subsystem/pathfinding/stat_entry(msg) + . = ..("Q:[length(pending)] P:[length(processing)]") + +/datum/controller/subsystem/pathfinding/fire(resumed) + + if(!resumed) + processing = pending?.Copy() + + var/atom/movable/mover + var/atom/target + var/datum/pathfinding_metadata/metadata + var/i = 0 + + while(i < processing.len) + + i++ + mover = processing[i] + target = processing[mover] + metadata = mover_metadata[mover] + dequeue_mover(mover, include_processing = FALSE) + + if(!QDELETED(mover) && !QDELETED(target)) + try_find_path(mover, target, metadata) + + if (MC_TICK_CHECK) + processing.Cut(1, i+1) + return + + processing.Cut() + +/datum/controller/subsystem/pathfinding/proc/try_find_path(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata, adjacency_call = _default_adjacency_call, distance_call = _default_distance_call) + + var/started_pathing = world.time + mover.waiting_for_path = started_pathing + + var/list/path = find_path_astar( + get_turf(mover), + target, + adjacency_call, + distance_call, + (metadata?.max_nodes || null), + (metadata?.max_node_depth || 250), + metadata?.min_target_dist, + metadata?.min_node_depth, + (metadata?.id || mover.GetIdCard()), + metadata?.obstacle, + check_tick = TRUE + ) + if(mover.waiting_for_path == started_pathing) + if(length(path)) + mover.path_found(path) + else + mover.path_not_found() + +/datum/pathfinding_metadata + var/max_nodes = null + var/max_node_depth = 250 + var/atom/id = null + var/min_target_dist = null + var/min_node_depth = null + var/obstacle = null + +/datum/pathfinding_metadata/New(_max_nodes, _max_node_depth, _id, _min_target_dist, _min_node_depth, _obstacle) + + id = _id + obstacle = _obstacle + max_nodes = _max_nodes + + if(!isnull(_max_node_depth)) + max_node_depth = _max_node_depth + if(!isnull(_min_target_dist)) + min_target_dist = _min_target_dist + if(!isnull(_min_node_depth)) + min_node_depth = _min_node_depth diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 4855a9a86c5e..6bccadcb70a8 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -89,7 +89,16 @@ SUBSYSTEM_DEF(ticker) if(job && job.create_record) CreateModularRecord(H) - callHook("roundstart") + // Initialize the roundstart timer + global.round_start_time = world.time + generate_multi_spawn_items() + SSlighting.handle_roundstart() + SSmapping.start_processing_all_planets() + SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) + global.using_map.refresh_lobby_browsers() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/loaded_modpack = SSmodpacks.loaded_modpacks[modpack_name] + loaded_modpack.on_roundstart() spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() // Drafts antags who don't override jobs. @@ -102,7 +111,6 @@ SUBSYSTEM_DEF(ticker) global.current_holiday.set_up_holiday() if(!length(global.admins)) - send2adminirc("Round has started with no admins online.") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Round Started (Game ID: [game_id])", "body" = "Round has started with no admins online.")) /datum/controller/subsystem/ticker/proc/playing_tick() @@ -128,7 +136,6 @@ SUBSYSTEM_DEF(ticker) return if(END_GAME_READY_TO_END) end_game_state = END_GAME_ENDING - callHook("roundend") if (universe_has_ended) if(mode.station_was_nuked) SSstatistics.set_field_details("end_proper","nuke") diff --git a/code/datums/ai/_ai.dm b/code/datums/ai/_ai.dm index 6e40fd7ab35c..9c943dadb4fb 100644 --- a/code/datums/ai/_ai.dm +++ b/code/datums/ai/_ai.dm @@ -62,6 +62,23 @@ /// Aggressive AI var; defined here for reference without casting. var/try_destroy_surroundings = FALSE + /// Reference to the atom we are targetting. + var/weakref/target_ref + + /// Current path for A* pathfinding. + var/list/executing_path + /// A counter for times we have failed to progress along our path. + var/path_frustration = 0 + /// A list of any obstacles we should path around in future. + var/list/path_obstacles = null + + /// Radius of target scan area when looking for valid targets. Set to 0 to disable target scanning. + var/target_scan_distance = 0 + /// Time tracker for next target scan. + var/next_target_scan_time + /// How long minimum between scans. + var/target_scan_delay = 1 SECOND + /datum/mob_controller/New(var/mob/living/target_body) body = target_body if(expected_type && !istype(body, expected_type)) @@ -71,6 +88,7 @@ /datum/mob_controller/Destroy() LAZYCLEARLIST(_friends) LAZYCLEARLIST(_enemies) + set_target(null) if(is_processing) STOP_PROCESSING(SSmob_ai, src) if(body) @@ -79,12 +97,6 @@ body = null . = ..() -/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) - return null - -/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) - return body && !body.client - /datum/mob_controller/proc/can_process() if(!body || !body.loc || ((body.client || body.mind) && !(body.status_flags & ENABLE_AI))) return FALSE @@ -111,13 +123,13 @@ // This is the place to actually do work in the AI. /datum/mob_controller/proc/do_process() SHOULD_CALL_PARENT(TRUE) - if(!QDELETED(body) && !QDELETED(src)) + if(get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src)) if(!body.stat) try_unbuckle() try_wander() try_bark() // Recheck in case we walked into lava or something during wandering. - return !QDELETED(body) && !QDELETED(src) + return get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src) return TRUE return FALSE @@ -132,16 +144,6 @@ else if(prob(25)) body.visible_message(SPAN_WARNING("\The [body] struggles against \the [body.buckled]!")) - -/datum/mob_controller/proc/get_activity() - return current_activity - -/datum/mob_controller/proc/set_activity(new_activity) - if(current_activity != new_activity) - current_activity = new_activity - return TRUE - return FALSE - // The mob will periodically sit up or step 1 tile in a random direction. /datum/mob_controller/proc/try_wander() //Movement @@ -185,133 +187,17 @@ else if(ispath(do_emote, /decl/emote)) body.emote(do_emote) -/datum/mob_controller/proc/get_target() - return null - -/datum/mob_controller/proc/set_target(atom/new_target) - return - -/datum/mob_controller/proc/find_target() - return - -/datum/mob_controller/proc/valid_target(var/atom/A) - return - -/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) - return - -/datum/mob_controller/proc/stop_wandering() - stop_wander = TRUE - -/datum/mob_controller/proc/resume_wandering() - stop_wander = FALSE - -/datum/mob_controller/proc/set_stance(new_stance) - if(stance != new_stance) - stance = new_stance - return TRUE - return FALSE - -/datum/mob_controller/proc/get_stance() - return stance - -/datum/mob_controller/proc/list_targets(var/dist = 7) - return - -/datum/mob_controller/proc/open_fire() - return - -/datum/mob_controller/proc/startle() - if(QDELETED(body) || body.stat != UNCONSCIOUS) - return - body.set_stat(CONSCIOUS) - if(body.current_posture?.prone) - body.set_posture(/decl/posture/standing) - -/datum/mob_controller/proc/retaliate(atom/source) - SHOULD_CALL_PARENT(TRUE) - if(!istype(body) || body.stat == DEAD) - return FALSE - startle() - if(isliving(source)) - remove_friend(source) - return TRUE - /datum/mob_controller/proc/destroy_surroundings() return -/datum/mob_controller/proc/lose_target() - return - -/datum/mob_controller/proc/lost_target() - return - /datum/mob_controller/proc/handle_death(gibbed) return -/datum/mob_controller/proc/pacify(mob/user) - lose_target() - add_friend(user) - -// General-purpose memorise proc, used by /commanded -/datum/mob_controller/proc/memorise(mob/speaker, message) - return - -// General-purpose memory checking proc, used by /faithful_hound -/datum/mob_controller/proc/check_memory(mob/speaker, message) - return FALSE - /// General-purpose scooping reaction proc, used by /passive. /// Returns TRUE if the scoop should proceed, FALSE if it should be canceled. /datum/mob_controller/proc/scooped_by(mob/initiator) return TRUE -// Enemy tracking - used on /aggressive -/datum/mob_controller/proc/get_enemies() - return _enemies - -/datum/mob_controller/proc/add_enemy(mob/enemy) - if(istype(enemy)) - LAZYDISTINCTADD(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/add_enemies(list/enemies) - for(var/thing in enemies) - if(ismob(thing)) - add_friend(thing) - else if(istype(thing, /weakref)) - LAZYDISTINCTADD(_enemies, thing) - -/datum/mob_controller/proc/remove_enemy(mob/enemy) - LAZYREMOVE(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/set_enemies(list/new_enemies) - _enemies = new_enemies - -/datum/mob_controller/proc/is_enemy(mob/enemy) - . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) - -/datum/mob_controller/proc/clear_enemies() - LAZYCLEARLIST(_enemies) - -// Friend tracking - used on /aggressive. -/datum/mob_controller/proc/get_friends() - return _friends - -/datum/mob_controller/proc/add_friend(mob/friend) - if(istype(friend)) - LAZYDISTINCTADD(_friends, weakref(friend)) - return TRUE - return FALSE - -/datum/mob_controller/proc/remove_friend(mob/friend) - LAZYREMOVE(_friends, weakref(friend)) - -/datum/mob_controller/proc/set_friends(list/new_friends) - _friends = new_friends - -/datum/mob_controller/proc/is_friend(mob/friend) - . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) - // By default, randomize the target area a bit to make armor/combat // a bit more dynamic (and avoid constant organ damage to the chest) /datum/mob_controller/proc/update_target_zone() diff --git a/code/datums/ai/_ai_enemies.dm b/code/datums/ai/_ai_enemies.dm new file mode 100644 index 000000000000..cbb7ddf46443 --- /dev/null +++ b/code/datums/ai/_ai_enemies.dm @@ -0,0 +1,35 @@ +// Enemy tracking - used on /aggressive +/datum/mob_controller/proc/get_enemies() + return _enemies + +/datum/mob_controller/proc/add_enemy(mob/enemy) + if(istype(enemy)) + LAZYDISTINCTADD(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/add_enemies(list/enemies) + for(var/thing in enemies) + if(ismob(thing)) + add_friend(thing) + else if(istype(thing, /weakref)) + LAZYDISTINCTADD(_enemies, thing) + +/datum/mob_controller/proc/remove_enemy(mob/enemy) + LAZYREMOVE(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/set_enemies(list/new_enemies) + _enemies = new_enemies + +/datum/mob_controller/proc/is_enemy(mob/enemy) + . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) + +/datum/mob_controller/proc/clear_enemies() + LAZYCLEARLIST(_enemies) + +/datum/mob_controller/proc/retaliate(atom/source) + SHOULD_CALL_PARENT(TRUE) + if(!istype(body) || body.stat == DEAD) + return FALSE + startle() + if(isliving(source)) + remove_friend(source) + return TRUE diff --git a/code/datums/ai/_ai_friends.dm b/code/datums/ai/_ai_friends.dm new file mode 100644 index 000000000000..3cab9046fced --- /dev/null +++ b/code/datums/ai/_ai_friends.dm @@ -0,0 +1,25 @@ +/datum/mob_controller/proc/pacify(mob/user) + lose_target() + add_friend(user) + +// Friend tracking - used on /aggressive. +/datum/mob_controller/proc/get_friends() + return _friends + +/datum/mob_controller/proc/add_friend(mob/friend) + if(istype(friend)) + LAZYDISTINCTADD(_friends, weakref(friend)) + return TRUE + return FALSE + +/datum/mob_controller/proc/remove_friend(mob/friend) + LAZYREMOVE(_friends, weakref(friend)) + +/datum/mob_controller/proc/set_friends(list/new_friends) + _friends = new_friends + +/datum/mob_controller/proc/is_friend(mob/friend) + . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) + +/datum/mob_controller/proc/clear_friends() + LAZYCLEARLIST(_friends) diff --git a/code/datums/ai/_ai_memory.dm b/code/datums/ai/_ai_memory.dm new file mode 100644 index 000000000000..f837a58cb8cd --- /dev/null +++ b/code/datums/ai/_ai_memory.dm @@ -0,0 +1,7 @@ +// General-purpose memorise proc, used by /commanded +/datum/mob_controller/proc/memorise(mob/speaker, message) + return + +// General-purpose memory checking proc, used by /faithful_hound +/datum/mob_controller/proc/check_memory(mob/speaker, message) + return FALSE diff --git a/code/datums/ai/_ai_pathfinding.dm b/code/datums/ai/_ai_pathfinding.dm new file mode 100644 index 000000000000..e01abaa05cec --- /dev/null +++ b/code/datums/ai/_ai_pathfinding.dm @@ -0,0 +1,29 @@ +/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) + return body && !body.client + +/datum/mob_controller/proc/clear_paths() + clear_path() + +/datum/mob_controller/proc/clear_path() + executing_path = null + body?.stop_automove() + +/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) + var/turf/move_target = (islist(executing_path) && length(executing_path)) ? executing_path[1] : null + if(!istype(move_target) || QDELETED(move_target)) + clear_path() + return null + return move_target + +/datum/mob_controller/proc/handle_post_automoved(atom/old_loc) + if(!islist(executing_path) || length(executing_path) <= 0) + return + var/turf/body_turf = get_turf(body) + if(!istype(body_turf)) + return + if(executing_path[1] != body_turf) + return + if(length(executing_path) > 1) + executing_path.Cut(1, 2) + else + clear_path() diff --git a/code/datums/ai/_ai_stance.dm b/code/datums/ai/_ai_stance.dm index ca018169811a..be3b11f94a72 100644 --- a/code/datums/ai/_ai_stance.dm +++ b/code/datums/ai/_ai_stance.dm @@ -1,30 +1,43 @@ // Stub type for future expansion/logic encapsulation. /decl/mob_controller_stance abstract_type = /decl/mob_controller_stance - /decl/mob_controller_stance/none - /decl/mob_controller_stance/idle - /decl/mob_controller_stance/alert - /decl/mob_controller_stance/attack - /decl/mob_controller_stance/attacking - /decl/mob_controller_stance/tired - /decl/mob_controller_stance/contained - /decl/mob_controller_stance/commanded abstract_type = /decl/mob_controller_stance/commanded - /decl/mob_controller_stance/commanded/stop - /decl/mob_controller_stance/commanded/follow - /decl/mob_controller_stance/commanded/misc - /decl/mob_controller_stance/commanded/heal - /decl/mob_controller_stance/commanded/healing +/decl/mob_controller_stance/busy + +/datum/mob_controller/proc/get_activity() + return current_activity + +/datum/mob_controller/proc/set_activity(new_activity) + if(current_activity != new_activity) + current_activity = new_activity + return TRUE + return FALSE + +/datum/mob_controller/proc/set_stance(new_stance) + if(stance != new_stance) + stance = new_stance + return TRUE + return FALSE + +/datum/mob_controller/proc/get_stance() + return stance + +/datum/mob_controller/proc/startle() + if(QDELETED(body) || body.stat != UNCONSCIOUS) + return + body.set_stat(CONSCIOUS) + if(body.current_posture?.prone) + body.set_posture(/decl/posture/standing) diff --git a/code/datums/ai/_ai_targets.dm b/code/datums/ai/_ai_targets.dm new file mode 100644 index 000000000000..49c5acedb094 --- /dev/null +++ b/code/datums/ai/_ai_targets.dm @@ -0,0 +1,77 @@ +/datum/mob_controller/proc/get_target() + if(isnull(target_ref)) + return null + var/atom/target = target_ref?.resolve() + if(!istype(target) || QDELETED(target)) + set_target(null) + return null + return target + +/datum/mob_controller/proc/set_target(atom/new_target) + var/weakref/new_target_ref = weakref(new_target) + if(target_ref != new_target_ref) + target_ref = new_target_ref + return TRUE + return FALSE + +/datum/mob_controller/proc/find_target() + SHOULD_CALL_PARENT(TRUE) + next_target_scan_time = world.time + target_scan_delay + +/datum/mob_controller/proc/valid_target(var/atom/A) + if(!istype(A)) + return FALSE + if(!A.simulated) + return FALSE + if(A == body) + return FALSE + if(A.invisibility > body.see_invisible) + return FALSE + if(LAZYLEN(_friends) && ismob(A) && (weakref(A) in _friends)) + return FALSE + if(!A.loc) + return FALSE + return TRUE + +/datum/mob_controller/proc/lose_target() + path_frustration = 0 + path_obstacles = null + set_target(null) + lost_target() + +/datum/mob_controller/proc/lost_target() + set_stance(STANCE_IDLE) + body.stop_automove() + +/datum/mob_controller/proc/list_targets() + // By default, we only target designated enemies. + var/list/enemies = get_enemies() + if(!LAZYLEN(enemies)) + return + var/list/possible_targets = get_raw_target_list() + if(!length(possible_targets)) + return + for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies + var/M = enemy.resolve() + if(M in possible_targets) + LAZYDISTINCTADD(., M) + +/datum/mob_controller/proc/do_target_scan() + . = target_scan_distance > 0 && world.time >= next_target_scan_time + +/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) + return + +/datum/mob_controller/proc/get_raw_target_list() + if(target_scan_distance) + return hearers(body, target_scan_distance)-body + return null + +/datum/mob_controller/proc/get_valid_targets() + . = list() + for(var/target in list_targets(target_scan_distance)) + if(valid_target(target)) + . += target + +/datum/mob_controller/proc/handle_ranged_target(atom/ranged_target) + return FALSE diff --git a/code/datums/ai/_ai_wander.dm b/code/datums/ai/_ai_wander.dm new file mode 100644 index 000000000000..705d3fdcef1e --- /dev/null +++ b/code/datums/ai/_ai_wander.dm @@ -0,0 +1,5 @@ +/datum/mob_controller/proc/stop_wandering() + stop_wander = TRUE + +/datum/mob_controller/proc/resume_wandering() + stop_wander = FALSE diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 62316d4d1977..e50d4e124ae0 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -2,36 +2,17 @@ stance = STANCE_IDLE stop_wander_when_pulled = FALSE try_destroy_surroundings = TRUE + target_scan_distance = 10 + var/attack_same_faction = FALSE var/only_attack_enemies = FALSE var/break_stuff_probability = 10 - var/weakref/target_ref /datum/mob_controller/aggressive/New() ..() if(isliving(body) && !QDELETED(body) && !QDELETED(src)) body.set_intent(I_FLAG_HARM) -/datum/mob_controller/aggressive/set_target(atom/new_target) - var/weakref/new_target_ref = weakref(new_target) - if(target_ref != new_target_ref) - target_ref = new_target_ref - return TRUE - return FALSE - -/datum/mob_controller/aggressive/get_target() - if(isnull(target_ref)) - return null - var/atom/target = target_ref?.resolve() - if(!istype(target) || QDELETED(target)) - set_target(null) - return null - return target - -/datum/mob_controller/aggressive/Destroy() - set_target(null) - return ..() - /datum/mob_controller/aggressive/do_process() if(!(. = ..())) @@ -42,24 +23,36 @@ set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) return + if(isnull(stance)) + set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) + if(isturf(body.loc) && !body.buckled) switch(stance) if(STANCE_IDLE) - set_target(find_target()) - set_stance(STANCE_ATTACK) + if(do_target_scan()) + set_target(find_target()) + if(get_target()) + set_stance(STANCE_ATTACK) if(STANCE_ATTACK) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - move_to_target() + + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + move_to_target() + else + set_stance(STANCE_IDLE) if(STANCE_ATTACKING) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - handle_attacking_target() + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + handle_attacking_target() + else + set_stance(STANCE_IDLE) if(STANCE_CONTAINED) //we aren't inside something so just switch set_stance(STANCE_IDLE) @@ -79,7 +72,7 @@ /datum/mob_controller/aggressive/proc/handle_attacking_target() stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) // consider replacing this list_targets() call with a distance or LOS check + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return FALSE if (ishuman(target)) @@ -209,51 +202,40 @@ return stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return if(body.has_ranged_attack() && get_dist(body, target) <= body.get_ranged_attack_distance() && !move_only) body.stop_automove() - open_fire() + handle_ranged_target(target) return set_stance(STANCE_ATTACKING) body.start_automove(target) -/datum/mob_controller/aggressive/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/list_targets() // Base hostile mobs will just destroy everything in view. // Mobs with an enemy list will filter the view by their enemies. if(!only_attack_enemies) - return hearers(body, dist)-body - var/list/enemies = get_enemies() - if(!LAZYLEN(enemies)) - return - var/list/possible_targets = hearers(body, dist)-body - if(!length(possible_targets)) - return - for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies - var/M = enemy.resolve() - if(M in possible_targets) - LAZYDISTINCTADD(., M) + return get_raw_target_list() + return ..() /datum/mob_controller/aggressive/find_target() + . = ..() if(!body.can_act() || !body.faction) return null resume_wandering() - for(var/atom/A in list_targets(10)) - if(valid_target(A)) - set_stance(STANCE_ATTACK) - body.face_atom(A) - return A + for(var/atom/A in get_valid_targets()) + set_stance(STANCE_ATTACK) + body.face_atom(A) + return A /datum/mob_controller/aggressive/valid_target(var/atom/A) - if(A == body) + if(!..()) return FALSE if(ismob(A)) var/mob/M = A if(M.faction == body.faction && !attack_same_faction) return FALSE - else if(weakref(M) in get_friends()) - return FALSE if(M.stat) return FALSE if(ishuman(M)) @@ -262,20 +244,12 @@ return FALSE return TRUE -/datum/mob_controller/aggressive/open_fire() - if(!body.can_act()) +/datum/mob_controller/aggressive/handle_ranged_target(atom/ranged_target) + if(!body.can_act() || !ranged_target) return FALSE - body.handle_ranged_attack(get_target()) + body.handle_ranged_attack(ranged_target) return TRUE -/datum/mob_controller/aggressive/lose_target() - set_target(null) - lost_target() - -/datum/mob_controller/aggressive/lost_target() - set_stance(STANCE_IDLE) - body.stop_automove() - /datum/mob_controller/aggressive/pacify(mob/user) ..() attack_same_faction = FALSE diff --git a/code/datums/ai/beast.dm b/code/datums/ai/beast.dm index 91ad1fec7a5a..9090698f55aa 100644 --- a/code/datums/ai/beast.dm +++ b/code/datums/ai/beast.dm @@ -36,7 +36,7 @@ qdel(S) break -/datum/mob_controller/aggressive/beast/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/beast/list_targets() . = ..() if(!length(.)) if(LAZYLEN(prey)) @@ -46,6 +46,6 @@ if(M) . |= M else if(body.get_nutrition() < body.get_max_nutrition() * 0.75) //time to look for some food - for(var/mob/living/L in view(body, dist)) + for(var/mob/living/L in get_raw_target_list()) if(attack_same_faction || L.faction != body.faction) LAZYDISTINCTADD(prey, weakref(L)) diff --git a/code/datums/ai/commanded.dm b/code/datums/ai/commanded.dm index e4452782a84a..c9e1e7f8e979 100644 --- a/code/datums/ai/commanded.dm +++ b/code/datums/ai/commanded.dm @@ -85,8 +85,8 @@ var/list/targets = get_targets_by_name(message) if(LAZYLEN(targets) != 1) //CONFUSED. WHO DO I FOLLOW? return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) //YEAH GOOD IDEA + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) //YEAH GOOD IDEA set_stance(STANCE_COMMANDED_FOLLOW) //GOT SOMEBODY. BETTER FOLLOW EM. return 1 @@ -98,7 +98,7 @@ return stop_wandering() var/atom/target = get_target() - if(istype(target) && (target in list_targets(10))) + if(istype(target) && (target in get_raw_target_list())) body.start_automove(target) /datum/mob_controller/aggressive/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused. @@ -125,12 +125,14 @@ LAZYADD(., weakref(M)) /datum/mob_controller/aggressive/commanded/find_target() + SHOULD_CALL_PARENT(FALSE) + next_target_scan_time = world.time + target_scan_delay if(!LAZYLEN(_allowed_targets)) return null var/mode = "specific" if(LAZYACCESS(_allowed_targets, 1) == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone. mode = "everyone" - for(var/atom/A in list_targets(10)) + for(var/atom/A in get_raw_target_list()) if(A == src) continue if(isliving(A)) diff --git a/code/datums/communication/aooc.dm b/code/datums/communication/aooc.dm index 52ca16f41941..8c4a25349c3e 100644 --- a/code/datums/communication/aooc.dm +++ b/code/datums/communication/aooc.dm @@ -30,7 +30,7 @@ receive_communication(C, target, SPAN_AOOC("[get_options_bar(C, 0, 1, 1)]: [message]")) else if(target.mob?.mind?.assigned_special_role) var/display_name = C.key - var/player_display = holder ? "[display_name]([usr.client.holder.rank])" : display_name + var/player_display = holder ? "[display_name]([C.holder.rank])" : display_name receive_communication(C, target, SPAN_AOOC("[player_display]: [message]")) /decl/communication_channel/aooc/do_broadcast(message) diff --git a/code/datums/config/config_types/config_mode.dm b/code/datums/config/config_types/config_mode.dm index 7db16b2ca346..6f91654a6887 100644 --- a/code/datums/config/config_types/config_mode.dm +++ b/code/datums/config/config_types/config_mode.dm @@ -6,7 +6,6 @@ /decl/config/lists/mode_allowed, /decl/config/lists/mode_votable, /decl/config/lists/mode_probabilities, - /decl/config/toggle/feature_object_spell_system, /decl/config/toggle/traitor_scaling, /decl/config/toggle/protect_roles_from_antagonist, /decl/config/toggle/continuous_rounds, @@ -78,10 +77,6 @@ var/decl/game_mode/game_mode = all_modes[mode_type] game_mode.probability = max(0, value[game_mode.uid]) -/decl/config/toggle/feature_object_spell_system - uid = "feature_object_spell_system" - desc = "Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard." - /decl/config/toggle/traitor_scaling uid = "traitor_scaling" desc = "If amount of traitors scales or not." @@ -93,7 +88,7 @@ /decl/config/toggle/continuous_rounds uid = "continuous_rounds" desc = list( - "Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked.", + "Remove the # to make rounds which end instantly continue until the shuttle is called or the station is nuked.", "Malf and Rev will let the shuttle be called when the antags/protags are dead." ) diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 472395682352..4365bbde4bb3 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -16,9 +16,6 @@ /decl/config/num/drone_build_time, /decl/config/num/max_character_traits, /decl/config/num/max_alternate_languages, - /decl/config/text/irc_bot_host, - /decl/config/text/main_irc, - /decl/config/text/admin_irc, /decl/config/text/server_name, /decl/config/text/server, /decl/config/text/serverurl, @@ -54,9 +51,7 @@ /decl/config/toggle/disable_webhook_embeds, /decl/config/toggle/delist_when_no_admins, /decl/config/toggle/wait_for_sigusr1_reboot, - /decl/config/toggle/use_irc_bot, /decl/config/toggle/show_typing_indicator_for_whispers, - /decl/config/toggle/announce_shuttle_dock_to_irc, /decl/config/toggle/guests_allowed, /decl/config/toggle/on/jobs_have_minimal_access, /decl/config/toggle/on/admin_legacy_system, @@ -170,20 +165,6 @@ default_value = 3 desc = "Remove the # to define a different maximum for alternate language selection in chargen." -/decl/config/text/irc_bot_host - uid = "irc_bot_host" - default_value = "localhost" - desc = "Host where the IRC bot is hosted. Port 45678 needs to be open." - -/decl/config/text/main_irc - uid = "main_irc" - default_value = "#main" - desc = "IRC channel to send information to. Leave blank to disable." - -/decl/config/text/admin_irc - uid = "admin_irc" - desc = "IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc." - // server name (for world name / status) /decl/config/text/server_name uid = "server_name" @@ -335,18 +316,10 @@ uid = "wait_for_sigusr1_reboot" desc = "Determines if Dream Daemon should refuse to reboot for any reason other than SIGUSR1." -/decl/config/toggle/use_irc_bot - uid = "use_irc_bot" - desc = "Determines if data is sent to the IRC bot. Generally requires MAIN_IRC and associated setup." - /decl/config/toggle/show_typing_indicator_for_whispers uid = "show_typing_indicator_for_whispers" desc = "Determinese if a typing indicator shows overhead for people currently writing whispers." -/decl/config/toggle/announce_shuttle_dock_to_irc - uid = "announce_shuttle_dock_to_irc" - desc = "Determines if announce shuttle dock announcements are sent to the main IRC channel, if MAIN_IRC has also been setup." - /decl/config/toggle/guests_allowed uid = "guests_allowed" desc = "Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server." diff --git a/code/datums/extensions/assembly/assembly_interaction.dm b/code/datums/extensions/assembly/assembly_interaction.dm index 9e250bb5d7bc..a4c4c8b2f920 100644 --- a/code/datums/extensions/assembly/assembly_interaction.dm +++ b/code/datums/extensions/assembly/assembly_interaction.dm @@ -20,7 +20,7 @@ return TRUE to_chat(user, "You begin repairing damage to \the [holder]...") - if(WT.weld(round(damage/75)) && do_after(usr, damage/10)) + if(WT.weld(round(damage/75)) && do_after(user, damage/10)) damage = 0 to_chat(user, "You repair \the [holder].") return TRUE @@ -33,11 +33,11 @@ for(var/obj/item/stock_parts/computer/H in parts) component_names.Add(H.name) - var/choice = input(usr, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names + var/choice = input(user, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names if(!choice) return TRUE var/atom/movable/HA = holder - if(!HA.Adjacent(usr)) + if(!HA.Adjacent(user)) return TRUE var/obj/item/stock_parts/H = find_component_by_name(choice) diff --git a/code/datums/extensions/eye/landing.dm b/code/datums/extensions/eye/landing.dm index b54a722cb4f9..deaa8dafc8d2 100644 --- a/code/datums/extensions/eye/landing.dm +++ b/code/datums/extensions/eye/landing.dm @@ -27,12 +27,12 @@ /datum/action/eye/landing/rotate_cw name = "Rotate clockwise" - procname ="turn_shuttle_cw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_cw) button_icon_state = "shuttle_rotate_cw" target_type = EYE_TARGET /datum/action/eye/landing/rotate_ccw name = "Rotate counterclockwise" - procname ="turn_shuttle_ccw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_ccw) button_icon_state = "shuttle_rotate_ccw" target_type = EYE_TARGET \ No newline at end of file diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index 55373db095d6..8792a616b5a6 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -82,7 +82,7 @@ G.check_accidents(user) if(G.safety() && !user.skill_fail_prob(SKILL_WEAPONS, 100, SKILL_EXPERT, 0.5)) //Experienced shooter will disable safety before shooting. G.toggle_safety(user) - usr.visible_message( + user.visible_message( "\The [user] draws \the [holstered], ready to go!", "You draw \the [holstered], ready to go!" ) diff --git a/code/datums/extensions/multitool/_multitool.dm b/code/datums/extensions/multitool/_multitool.dm deleted file mode 100644 index fd581a007f94..000000000000 --- a/code/datums/extensions/multitool/_multitool.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MT_NOACTION 0 -#define MT_REFRESH 1 -#define MT_CLOSE 2 diff --git a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm index 703d9c4f3f6a..ae95b5cb13a2 100644 --- a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm +++ b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm @@ -25,5 +25,5 @@ board.build_path = path var/obj/thing = path board.SetName("circuitboard ([initial(thing.name)])") - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm index 9e2679682461..77ad6c394f32 100644 --- a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm +++ b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm @@ -19,11 +19,11 @@ break if(!new_name) to_chat(user, SPAN_WARNING("No eligible shuttle could be located. Make sure the board is inside a shuttle and try again.")) - return MT_NOACTION + return TOPIC_NOACTION if(!board.is_valid_shuttle(SSshuttle.shuttles[new_name])) to_chat(user, SPAN_WARNING("The current shuttle does not support this console type. Try a different shuttle or circuit board.")) - return MT_NOACTION + return TOPIC_NOACTION board.shuttle_tag = new_name to_chat(user, SPAN_NOTICE("You set the shuttle name to '[new_name]'.")) - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/stationalert.dm b/code/datums/extensions/multitool/circuitboards/stationalert.dm index e3ec67a20247..209dfba6b736 100644 --- a/code/datums/extensions/multitool/circuitboards/stationalert.dm +++ b/code/datums/extensions/multitool/circuitboards/stationalert.dm @@ -18,12 +18,12 @@ var/datum/alarm_handler/AH = locate(href_list["add"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers |= AH - return MT_REFRESH + return TOPIC_REFRESH if(href_list["remove"]) var/datum/alarm_handler/AH = locate(href_list["remove"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers -= AH - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/cable.dm b/code/datums/extensions/multitool/items/cable.dm index f58fc8232977..7f95e27e73e7 100644 --- a/code/datums/extensions/multitool/items/cable.dm +++ b/code/datums/extensions/multitool/items/cable.dm @@ -21,6 +21,6 @@ var/obj/item/stack/cable_coil/cable_coil = holder if(href_list["select_color"] && (href_list["select_color"] in get_global_cable_colors())) cable_coil.set_cable_color(href_list["select_color"], user) - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/stock_parts_radio.dm b/code/datums/extensions/multitool/items/stock_parts_radio.dm index ec0b51dc4549..e35bf8649774 100644 --- a/code/datums/extensions/multitool/items/stock_parts_radio.dm +++ b/code/datums/extensions/multitool/items/stock_parts_radio.dm @@ -49,48 +49,48 @@ var/obj/item/stock_parts/radio/radio = holder if(href_list["unlink"]) machine = null - return MT_CLOSE + return TOPIC_CLOSE if(href_list["frequency"]) var/new_frequency = input(user, "Select a new frequency:", "Frequency Selection", radio.frequency) as null|num if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) if(new_frequency == radio.frequency) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(new_frequency, radio.filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["id_tag"]) var/new_id_tag = input(user, "Select a new ID:", "ID Selection", radio.id_tag) as null|text if(!new_id_tag || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_id_tag = sanitize(new_id_tag) if(new_id_tag == radio.id_tag) - return MT_NOACTION + return TOPIC_NOACTION radio.set_id_tag(new_id_tag) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["filter"]) var/new_filter = input(user, "Select a new radio filter (usually signals are sent to listeners on your id_tag; this will override that behavior):", "Filter Selection", radio.filter) as null|anything in global.all_selectable_radio_filters if(!new_filter || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION if(new_filter == radio.filter) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(radio.frequency, new_filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["encryption"]) var/new_encryption = input(user, "Select a new encryption key:", "Encryption Key Selection", radio.encryption) as null|num if(!new_encryption || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_encryption = sanitize_integer(new_encryption, 0, 999, radio.encryption) if(new_encryption == radio.encryption) - return MT_NOACTION + return TOPIC_NOACTION radio.encryption = new_encryption - return MT_REFRESH + return TOPIC_REFRESH if(href_list["stockreset"]) var/obj/machinery/actual_machine = machine && machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE actual_machine.apply_preset_to(radio) - return MT_REFRESH + return TOPIC_REFRESH // Helper. /datum/extension/interactive/multitool/radio/proc/event_list_to_selection_table(table_tag, list/selected_events) @@ -111,44 +111,44 @@ if(href_list["remove"]) var/thing = href_list["remove"] LAZYREMOVE(selected_events, thing) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["rename"]) var/thing = href_list["rename"] if(selected_events && selected_events[thing]) var/new_name = input(user, "Select a new message key for this item:", "Key Select", thing) as null|text new_name = sanitize(new_name) if(!new_name || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!selected_events || !selected_events[thing]) - return MT_REFRESH + return TOPIC_REFRESH selected_events[new_name] = selected_events[thing] selected_events -= thing - return MT_REFRESH + return TOPIC_REFRESH if(href_list["new_val"]) var/thing = href_list["new_val"] var/decl/public_access/variable = selected_events && selected_events[thing] if(!variable || !LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH var/valid_variables = list() for(var/path in valid_events) valid_variables += valid_events[path] var/new_var = input(user, "Select a new action for this item:", "Action Select", thing) as null|anything in valid_variables if(!new_var || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!(selected_events && selected_events[thing] == variable)) - return MT_REFRESH + return TOPIC_REFRESH selected_events[thing] = new_var - return MT_REFRESH + return TOPIC_REFRESH if(href_list["add"]) if(!LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH LAZYSET(selected_events, copytext(md5(num2text(rand(0, 1))), 1, 11), valid_events[pick(valid_events)]) // random key - return MT_REFRESH + return TOPIC_REFRESH if(href_list["desc"]) var/decl/public_access/variable = locate(href_list["desc"]) if(istype(variable)) to_chat(user, variable.desc) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/radio/transmitter/aquire_target() var/obj/machinery/actual_machine = ..() @@ -178,7 +178,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/basic/radio = holder if(href_list["on_change"]) return event_list_topic(radio.transmit_on_change, actual_machine.public_variables, user, href_list) @@ -216,7 +216,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/on_event/radio = holder if(href_list["on_event"]) @@ -257,7 +257,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/receiver/radio = holder if(href_list["call"]) return event_list_topic(radio.receive_and_call, actual_machine.public_methods, user, href_list) diff --git a/code/datums/extensions/multitool/multitool.dm b/code/datums/extensions/multitool/multitool.dm index 08e98ebe7ebc..7bfdeac27708 100644 --- a/code/datums/extensions/multitool/multitool.dm +++ b/code/datums/extensions/multitool/multitool.dm @@ -13,7 +13,7 @@ popup.set_content(html) popup.open() else - close_window(usr) + close_window(user) /datum/extension/interactive/multitool/proc/get_interact_window(var/obj/item/multitool/M, var/mob/user) return @@ -36,7 +36,7 @@ /datum/extension/interactive/multitool/extension_act(href, href_list, var/mob/user) if(..()) - close_window(usr) + close_window(user) return TRUE var/obj/item/multitool/M = user.get_multitool() @@ -45,26 +45,29 @@ . = send_buffer(M, buffer, user) else if(href_list["purge"]) M.set_buffer(null) - . = MT_REFRESH + . = TOPIC_REFRESH else . = on_topic(href, href_list, user) - switch(.) - if(MT_REFRESH) - interact(M, user) - if(MT_CLOSE) - close_window(user) - return MT_NOACTION ? FALSE : TRUE + if(. & TOPIC_CLOSE) + close_window(user) + return TOPIC_HANDLED // don't run any other Topic() behavior for this call + else if(. & TOPIC_REFRESH) + interact(M, user) + return TOPIC_HANDLED // don't return TOPIC_REFRESH to avoid any potential double-refreshes + else if(!.) + return TOPIC_NOACTION + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/on_topic(href, href_list, user) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/proc/send_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) if(M.get_buffer() == buffer && buffer) receive_buffer(M, buffer, user) else if(!buffer) to_chat(user, "Unable to acquire data from the buffered object. Purging from memory.") - return MT_REFRESH + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/receive_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) return \ No newline at end of file diff --git a/code/datums/extensions/storage/_storage.dm b/code/datums/extensions/storage/_storage.dm index a901951417bc..c79e91a7357b 100644 --- a/code/datums/extensions/storage/_storage.dm +++ b/code/datums/extensions/storage/_storage.dm @@ -79,12 +79,10 @@ var/global/list/_test_storage_items = list() LAZYDISTINCTADD(., storage_inv) /datum/storage/proc/show_to(mob/user) - if(storage_ui) - storage_ui.show_to(user) + storage_ui?.show_to(user) /datum/storage/proc/hide_from(mob/user) - if(storage_ui) - storage_ui.hide_from(user) + storage_ui?.hide_from(user) /datum/storage/proc/open(mob/user) if(!opened) @@ -98,11 +96,12 @@ var/global/list/_test_storage_items = list() robot.hud_used.toggle_show_robot_modules() prepare_ui() - storage_ui.on_open(user) - storage_ui.show_to(user) + if(storage_ui) + storage_ui.on_open(user) + storage_ui.show_to(user) /datum/storage/proc/prepare_ui() - storage_ui.prepare_ui() + storage_ui?.prepare_ui() /datum/storage/proc/close(mob/user) if(opened) @@ -110,12 +109,10 @@ var/global/list/_test_storage_items = list() play_close_sound() holder?.queue_icon_update() hide_from(user) - if(storage_ui) - storage_ui.after_close(user) + storage_ui?.after_close(user) /datum/storage/proc/close_all() - if(storage_ui) - storage_ui.close_all() + storage_ui?.close_all() /datum/storage/proc/storage_space_used() . = 0 diff --git a/code/datums/extensions/storage/subtypes_basket.dm b/code/datums/extensions/storage/subtypes_basket.dm index 26b00fd25da4..e5601ca91158 100644 --- a/code/datums/extensions/storage/subtypes_basket.dm +++ b/code/datums/extensions/storage/subtypes_basket.dm @@ -3,3 +3,6 @@ use_sound = 'sound/effects/storage/box.ogg' max_w_class = ITEM_SIZE_LARGE max_storage_space = DEFAULT_BOX_STORAGE + +/datum/storage/basket/large + max_storage_space = DEFAULT_BACKPACK_STORAGE diff --git a/code/datums/extensions/storage/subtypes_sheets.dm b/code/datums/extensions/storage/subtypes_sheets.dm index 1db2042cb97d..a72c49ab856d 100644 --- a/code/datums/extensions/storage/subtypes_sheets.dm +++ b/code/datums/extensions/storage/subtypes_sheets.dm @@ -44,10 +44,10 @@ inserted = 1 break if(!inserted || !S.amount) - usr.drop_from_inventory(S, holder) + user.drop_from_inventory(S, holder) if(!S.amount) qdel(S) - prepare_ui(usr) + prepare_ui(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() @@ -64,8 +64,8 @@ if(!S.amount) qdel(S) // todo: there's probably something missing here prepare_ui() - if(usr.active_storage) - usr.active_storage.show_to(usr) + if(user.active_storage) + user.active_storage.show_to(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() diff --git a/code/datums/mil_ranks.dm b/code/datums/mil_ranks.dm index 23a0b69cb662..136559c4aa7c 100644 --- a/code/datums/mil_ranks.dm +++ b/code/datums/mil_ranks.dm @@ -143,10 +143,11 @@ var/global/datum/mil_branches/mil_branches = new() . += spawn_rank +// todo: should this be on /datum/map? this will need heavy reworking if we promote submaps from second to first class map status anyway /** * Populate the global branches list from global.using_map */ -/hook/startup/proc/populate_branches() +/proc/populate_branches() if(!(global.using_map.flags & MAP_HAS_BRANCH) && !(global.using_map.flags & MAP_HAS_RANK)) mil_branches.branches = null mil_branches.spawn_branches_ = null diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 355cd25efdc7..34bad84cb65d 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -78,7 +78,6 @@ /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) - current.spellremove() current = null if (original == deleted_mob) @@ -152,8 +151,8 @@ if(href_list["add_goal"]) - var/mob/caller = locate(href_list["add_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["add_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(can_modify) if(is_admin) @@ -171,8 +170,8 @@ if(href_list["abandon_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["abandon_goal"]) - var/mob/caller = locate(href_list["abandon_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["abandon_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && can_modify) if(usr == current) @@ -186,8 +185,8 @@ if(href_list["reroll_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["reroll_goal"]) - var/mob/caller = locate(href_list["reroll_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["reroll_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && (goal in goals) && can_modify) qdel(goal) diff --git a/code/datums/movement/automove_controller.dm b/code/datums/movement/automove_controller.dm index 08dae443f358..b413d9998497 100644 --- a/code/datums/movement/automove_controller.dm +++ b/code/datums/movement/automove_controller.dm @@ -1,7 +1,8 @@ /// Implements automove logic; can be overridden on mob procs if you want to vary the logic from the below. /decl/automove_controller - var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. - var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. + var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/try_avoid_obstacles = TRUE // Will try to move 90 degrees around an obstacle. /decl/automove_controller/proc/handle_mover(atom/movable/mover, datum/automove_metadata/metadata) @@ -49,14 +50,16 @@ return TRUE // no idea how we would get into this position if(mover.SelfMove(target_dir) && (old_loc != mover.loc)) - return TRUE + mover.handle_post_automoved(old_loc) + return (mover.get_automove_target() == mover.loc) // We may have transitioned to the next step in a path. - // Try to move around any obstacle. - var/static/list/_alt_dir_rot = list(45, -45) - for(var/alt_dir in shuffle(_alt_dir_rot)) - mover.reset_movement_delay() - if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) - return TRUE + if(try_avoid_obstacles) + // Try to move around any obstacle. + var/static/list/_alt_dir_rot = list(45, -45) + for(var/alt_dir in shuffle(_alt_dir_rot)) + mover.reset_movement_delay() + if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) + return TRUE mover.failed_automove() diff --git a/code/datums/outfits/equipment/backpacks.dm b/code/datums/outfits/equipment/backpacks.dm index 13b7df63e46c..2a4aed715eab 100644 --- a/code/datums/outfits/equipment/backpacks.dm +++ b/code/datums/outfits/equipment/backpacks.dm @@ -43,6 +43,14 @@ name = "Sack" path = /obj/item/bag/sack +/decl/backpack_outfit/haversack + name = "Haversack" + path = /obj/item/backpack/crafted + +/decl/backpack_outfit/backpack/crafted + name = "Handmade Backpack" + path = /obj/item/backpack/crafted/backpack + /* Code */ /decl/backpack_outfit var/flags diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 572306145f56..c3728f48a2a5 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -1,24 +1,26 @@ /decl/outfit abstract_type = /decl/outfit - var/name = "Naked" - var/uniform = null - var/suit = null - var/back = null - var/belt = null - var/gloves = null - var/shoes = null - var/head = null - var/mask = null - var/l_ear = null - var/r_ear = null - var/glasses = null - var/id = null - var/l_pocket = null - var/r_pocket = null + var/name = "Naked And Afraid" + var/uniform = null + var/suit = null + var/back = null + var/belt = null + var/gloves = null + var/shoes = null + var/head = null + var/mask = null + var/l_ear = null + var/r_ear = null + var/glasses = null + var/id = null + var/l_pocket = null + var/r_pocket = null var/suit_store = null - var/holster = null + var/holster = null + /// Linear list of types. Will attempt to place items in hands. var/list/hands - var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + //. An associative list in list(path=count,otherpath=count) format. Will attempt to place items in storage. + var/list/backpack_contents var/id_type var/id_desc @@ -36,16 +38,21 @@ . = ..() backpack_overrides = backpack_overrides || list() -// This proc is structured slightly strangely because I will be adding pants to it. +// Used for slightly cleaner code around multi-equip records. +/decl/outfit/proc/resolve_equip_to_list(check_type) + if(islist(check_type)) + return check_type + if(ispath(check_type)) + return list(check_type) + return null + /decl/outfit/validate() . = ..() for(var/check_type in list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, pda_type, id_type)) - var/obj/item/thing = check_type - if(isnull(thing)) - continue - if(TYPE_IS_ABSTRACT(thing)) - . += "equipment includes abstract type '[thing]'" + for(var/obj/item/thing as anything in resolve_equip_to_list(check_type)) + if(TYPE_IS_ABSTRACT(thing)) + . += "equipment includes abstract type '[thing]'" for(var/check_type in hands) var/obj/item/thing = check_type @@ -62,18 +69,27 @@ . += "backpack includes abstract type '[thing]'" if(uniform && (outfit_flags & OUTFIT_HAS_VITALS_SENSOR)) - if(!ispath(uniform, /obj/item/clothing)) - . += "outfit is flagged for sensors, but uniform cannot take accessories" - var/succeeded = FALSE - var/obj/item/sensor = new /obj/item/clothing/sensor/vitals - if(uniform) - var/obj/item/clothing/wear_uniform = new uniform // sadly we need to read a list - if(wear_uniform.can_attach_accessory(sensor)) - succeeded = TRUE - qdel(wear_uniform) - if(!succeeded) - . += "outfit is flagged for sensors, but uniform does not accept sensors" - qdel(sensor) + var/list/uniforms = resolve_equip_to_list(uniform) + if(!length(uniforms)) + . += "outfit is flagged for sensors, but has no uniform" + else + var/succeeded = FALSE + var/obj/item/sensor = new /obj/item/clothing/sensor/vitals + for(var/thing in uniforms) + if(!ispath(thing, /obj/item/clothing)) + . += "outfit is flagged for sensors, but uniform [thing] cannot take accessories" + if(thing) + var/obj/item/clothing/wear_uniform = new thing // sadly we need to read a list + if(wear_uniform.can_attach_accessory(sensor)) + succeeded = TRUE + if(!QDELETED(wear_uniform)) + qdel(wear_uniform) + if(succeeded) + break + if(!QDELETED(sensor)) + qdel(sensor) + if(!succeeded) + . += "outfit is flagged for sensors, but uniform does not accept sensors" /decl/outfit/proc/pre_equip(mob/living/wearer) if(outfit_flags & OUTFIT_RESET_EQUIPMENT) @@ -91,8 +107,8 @@ equip_base(wearer, equip_adjustments) equip_id(wearer, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) - var/number = backpack_contents[path] - for(var/i=0,iRemember: do not forget to prepare your spells.", /decl/memory_options/system) - wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" - wizard.current.SetName(wizard.current.real_name) - -/decl/special_role/wizard/equip_role(var/mob/living/human/wizard_mob) - default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/outfit/wizard)) - . = ..() - -/decl/special_role/wizard/print_player_summary() - ..() - for(var/p in current_antagonists) - var/datum/mind/player = p - var/text = "[player.name]'s spells were:" - if(!player.learned_spells || !player.learned_spells.len) - text += "
None!" - else - for(var/s in player.learned_spells) - var/spell/spell = s - text += "
[spell.name] - " - text += "Speed: [spell.spell_levels["speed"]] Power: [spell.spell_levels["power"]]" - text += "
" - to_world(text) - - -//To batch-remove wizard spells. Linked to mind.dm. -/mob/proc/spellremove() - if(!mind || !mind.learned_spells) - return - for(var/spell/spell_to_remove in mind.learned_spells) - remove_spell(spell_to_remove) - -// Does this clothing slot count as wizard garb? (Combines a few checks) -/proc/is_wiz_garb(var/obj/item/clothing/C) - return istype(C) && C.wizard_garb - -/*Checks if the wizard is wearing the proper attire. -Made a proc so this is not repeated 14 (or more) times.*/ -/mob/proc/wearing_wiz_garb() - to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") - return 0 - -// Humans can wear clothes. -/mob/living/human/wearing_wiz_garb() - if(!is_wiz_garb(get_equipped_item(slot_wear_suit_str)) && (!istype(species.species_hud) || (slot_wear_suit_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my robe.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_shoes_str)) && (!istype(species.species_hud) || (slot_shoes_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my sandals.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_head_str)) && (!istype(species.species_hud) || (slot_head_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my hat.") - return 0 - return 1 diff --git a/code/game/atoms_fires.dm b/code/game/atoms_fires.dm new file mode 100644 index 000000000000..c70cc007cb87 --- /dev/null +++ b/code/game/atoms_fires.dm @@ -0,0 +1,21 @@ +// Stubs for atom fire system, TODO. +/atom/proc/set_fire_intensity(amount) + return + +/atom/proc/get_fire_intensity() + return 0 + +/atom/proc/adjust_fire_intensity(amount) + return + +/atom/proc/can_ignite() + return FALSE + +/atom/proc/ignite_fire() + return + +/atom/proc/extinguish_fire(mob/user, no_message = FALSE) + return + +/atom/proc/is_on_fire() + return FALSE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779daa..477e9d25c5df 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -40,6 +40,9 @@ // Marker for alpha mask update process. null == never update, TRUE == currently updating, FALSE == finished updating. var/updating_turf_alpha_mask = null + // Damage type from using or throwing this atom. + var/atom_damage_type = BRUTE + // This proc determines if the instance is preserved when the process() despawn of crypods occurs. /atom/movable/proc/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return FALSE @@ -581,6 +584,9 @@ if(!.) // If we're under or inside shelter, use the z-level rain (for ambience) . = SSweather.weather_by_z[my_turf.z] +/atom/movable/proc/handle_post_automoved(atom/old_loc) + return + /atom/movable/take_vaporized_reagent(reagent, amount) if(ATOM_IS_OPEN_CONTAINER(src)) return loc?.take_vaporized_reagent(reagent, amount) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 8de40b0d1234..e9b2d2e40fd4 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -15,9 +15,9 @@ var/global/universe_has_ended = 0 /datum/universal_state/supermatter_cascade/OnTurfChange(var/turf/T) var/turf/space/S = T if(istype(S)) - S.color = "#0066ff" + S.set_color("#0066ff") else - S.color = initial(S.color) + S.set_color(initial(S.color)) /datum/universal_state/supermatter_cascade/DecayTurf(var/turf/T) T.handle_universal_decay() diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 9a95ba9802fd..9bfdd9791429 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -410,7 +410,6 @@ var/global/list/additional_antag_types = list() if(escaped_total > 0) SSstatistics.set_field("escaped_total",escaped_total) - send2mainirc("A round of [src.name] has ended - [surviving_total] survivor\s, [ghosts] ghost\s.") SSwebhooks.send(WEBHOOK_ROUNDEND, list("survivors" = surviving_total, "escaped" = escaped_total, "ghosts" = ghosts, "clients" = clients)) return 0 diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm deleted file mode 100644 index c5adb272efec..000000000000 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/clothing/head/caretakerhood - name = "holy hood" - desc = "The hood of a shining white robe, with blue trim. Who would possess this robe and still want to hide themself away?" - icon = 'icons/clothing/head/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/caretakercloak - name = "holy cloak" - desc = "A shining white and blue robe. For some reason, it reminds you of the holidays." - icon = 'icons/clothing/suits/wizard/servant/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/shoes/dress/caretakershoes - name = "black leather shoes" - desc = "Dress shoes. These aren't as shiny as usual." - inset_color = COLOR_SKY_BLUE - shine = 30 - armor = list( - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/champion.dm b/code/game/gamemodes/wizard/servant_items/champion.dm deleted file mode 100644 index 80e04ee1bfdc..000000000000 --- a/code/game/gamemodes/wizard/servant_items/champion.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/clothing/head/champhelm - name = "champion's crown" - desc = "A spiky, golden crown. It's probably worth more than your bank account." - - icon = 'icons/clothing/head/champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/champarmor - name = "champion's armor" - desc = "A mighty suit of silver and gold armor, with a gleaming blue crystal inlaid into its left gaunlet." - icon = 'icons/clothing/suits/wizard/servant/champion.dmi' - siemens_coefficient = 0.5 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/pants/champion - name = "champion's garb" - desc = "Some dark, archaic leggings." - icon = 'icons/clothing/pants/leggings/leggings_champion.dmi' - siemens_coefficient = 0.8 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR - ) - starting_accessories = list( - /obj/item/clothing/shirt/tunic/blue/champion - ) - -/obj/item/clothing/shoes/jackboots/medievalboots - name = "leather boots" - desc = "Old-fashioned leather boots. Probably not something you want to get kicked with." - material = /decl/material/solid/organic/leather - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED - ) - artificail_shine = 0 - -/obj/item/sword/excalibur - name = "champion's blade" - desc = "For at his belt hung Excalibur, the finest sword that there was, which sliced through iron as through wood." - icon = 'icons/obj/items/weapon/swords/excalibur.dmi' - attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cleaved", "sundered") - material_alteration = MAT_FLAG_ALTERATION_NONE - -/obj/item/sword/excalibur/on_picked_up(var/mob/living/user) - if(user.mind) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(!wizards.is_antagonist(user.mind) || user.mind.assigned_special_role != "Spellbound Servant") - START_PROCESSING(SSobj, src) - to_chat(user,"\The [src] heats up in your hands, burning you!") - -/obj/item/sword/excalibur/Process() - if(isliving(loc)) - if(ishuman(loc)) - var/mob/living/human/H = loc - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - E?.take_external_damage(burn=2,used_weapon="stovetop") - else - var/mob/living/M = loc - M.take_damage(2, BURN) - if(prob(2)) - to_chat(loc,"\The [src] is burning you!") - return 1 - -/obj/item/sword/excalibur/dropped() - . = ..() - STOP_PROCESSING(SSobj, src) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/familiar.dm b/code/game/gamemodes/wizard/servant_items/familiar.dm deleted file mode 100644 index 05cc8cdf9610..000000000000 --- a/code/game/gamemodes/wizard/servant_items/familiar.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/clothing/head/bandana/familiarband - name = "familiar's headband" - desc = "It's a simple headband made of leather." - icon = 'icons/clothing/head/familiar.dmi' - -/obj/item/clothing/pants/familiar - name = "familiar's garb" - desc = "Some rough leather leggings, reinforced here and there. A hasty job." - starting_accessories = list( - /obj/item/clothing/shirt/tunic/green/familiar - ) - -/obj/item/clothing/pants/familiar/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_w_uniform_str, -3) diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm deleted file mode 100644 index e52606eb62f8..000000000000 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ /dev/null @@ -1,49 +0,0 @@ -/obj/item/clothing/head/fiendhood - name = "fiend's hood" - desc = "A dark hood with blood-red trim. Something about the fabric blocks more light than it should." - icon = 'icons/clothing/head/fiend_hood.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/fiendcowl - name = "fiend's cowl" - desc = "A charred black duster with red trim. In its fabric, you can see the faint outline of millions of eyes." - icon = 'icons/clothing/suits/wizard/servant/fiend_cowl.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/costume/fiendsuit - name = "black suit" - desc = "A snappy black suit with red trim. The undershirt's stained with something, though..." - icon = 'icons/clothing/suits/suit_fiend.dmi' - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/shoes/dress/devilshoes - desc = "Off-colour leather dress shoes. Their footsteps are silent." - inset_color = COLOR_MAROON - item_flags = ITEM_FLAG_SILENT - color = "#2e1e1e" - -/obj/item/clothing/head/fiendhood/fem - name = "fiend's visage" - desc = "To gaze upon this is to gaze into an inferno. Look away, before it looks back of its own accord." - icon = 'icons/clothing/head/fiend_visage.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/fiendcowl/fem - name = "fiend's robe" - icon = 'icons/clothing/suits/wizard/servant/fiend_robe.dmi' - desc = "A tattered, black and red robe. Nothing is visible through the holes in its fabric, except for a strange, inky blackness. It looks as if it was stitched together with other clothing..." diff --git a/code/game/gamemodes/wizard/servant_items/infiltrator.dm b/code/game/gamemodes/wizard/servant_items/infiltrator.dm deleted file mode 100644 index 846addc5b7c3..000000000000 --- a/code/game/gamemodes/wizard/servant_items/infiltrator.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/clothing/head/infilhat - name = "immaculate fedora" - desc = "Whoever owns this hat means business. Hopefully, it's just good business." - color = COLOR_SILVER - icon = 'icons/clothing/head/detective.dmi' - markings_state_modifier = "band" - markings_color = COLOR_DARK_GRAY - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/infilsuit - name = "immaculate suit" - desc = "The clothes of an impeccable diplomat. Or perhaps a businessman. Let's not consider the horrors that might arise if it belongs to a lawyer." - icon = 'icons/clothing/suits/wizard/servant/inf_suit.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - -/obj/item/clothing/shoes/dress/infilshoes - name = "black leather shoes" - desc = "Dress shoes. Their footsteps are dead silent." - inset_color = COLOR_INDIGO - item_flags = ITEM_FLAG_SILENT - -/obj/item/clothing/head/infilhat/fem - name = "maid's headband" - desc = "This dainty, frilled thing is apparently meant to go on your head." - icon = 'icons/clothing/head/inf_hat.dmi' - markings_state_modifier = null - -/obj/item/clothing/suit/infilsuit/fem - name = "maid's uniform" - desc = "The uniform of someone you'd expect to see dusting off the Antique Gun's display case." - icon = 'icons/clothing/suits/wizard/servant/inf_dress.dmi' diff --git a/code/game/gamemodes/wizard/servant_items/overseer.dm b/code/game/gamemodes/wizard/servant_items/overseer.dm deleted file mode 100644 index f8676e0440d6..000000000000 --- a/code/game/gamemodes/wizard/servant_items/overseer.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/head/overseerhood - name = "grim hood" - desc = "Darker than dark. What... what is this made of?" - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - icon = 'icons/clothing/head/necromancer.dmi' - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/straight_jacket/overseercloak - name = "grim cloak" - desc = "The void of space woven into fabric. It's hard to tell where its edges are." - icon = 'icons/clothing/suits/wizard/servant/overseer.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - -//These are the ones that it gets when they toggle it off -/obj/item/clothing/shoes/sandal/grimboots - name = "stained boots" - desc = "These boots are stained with blood so dry that it's turned black..." - color = COLOR_BLACK - shine = 10 - item_flags = ITEM_FLAG_SILENT \ No newline at end of file diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm deleted file mode 100644 index 72792403db14..000000000000 --- a/code/game/gamemodes/wizard/wizard.dm +++ /dev/null @@ -1,10 +0,0 @@ -/decl/game_mode/wizard - name = "Wizard" - round_description = "There is a SPACE WIZARD onboard. You can't let the magician achieve their objectives!" - extended_round_description = "A powerful space wizard has made their way on board. They have a wide variety of powers and spells available to them that makes your own simple moral self tremble with fear and excitement. Ultimately, their purpose is unknown. However, it is up to you and your crew to decide if their powers can be used for good or if their arrival foreshadows devastation." - uid = "wizard" - required_players = 5 - required_enemies = 1 - end_on_antag_death = FALSE - associated_antags = list(/decl/special_role/wizard) - probability = 1 diff --git a/code/game/gamemodes/wizard/wizard_props.dm b/code/game/gamemodes/wizard/wizard_props.dm deleted file mode 100644 index b8b834679db1..000000000000 --- a/code/game/gamemodes/wizard/wizard_props.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/structure/talisman_altar - name = "Altar" - desc = "A bloodstained altar dedicated to the worship of some unknown dark entity." - icon = 'icons/obj/cult.dmi' - icon_state = "talismanaltar" - density = TRUE - anchored = TRUE - -/obj/structure/fake_pylon - name = "\improper Pylon" - desc = "A floating crystal that hums with an unearthly energy." - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - light_power = 0.5 - light_range = 13 - light_color = "#3e0000" - -// A de-culted version of the cult gateway, for the wizard base map. -/obj/effect/gateway/active/spooky - light_range=5 - light_color="#ff0000" \ No newline at end of file diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 979f91bd0349..0d6369221804 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -460,12 +460,6 @@ var/global/const/access_mercenary = "ACCESS_MERCENARY" desc = "Mercenary" access_type = ACCESS_TYPE_ANTAG -var/global/const/access_wizard = "ACCESS_WIZARD" -/datum/access/wizard - id = access_wizard - desc = "Wizard" - access_type = ACCESS_TYPE_ANTAG - /******* * Misc * *******/ diff --git a/code/game/jobs/server_whitelist.dm b/code/game/jobs/server_whitelist.dm index 083876ecad32..9c8b84f46b57 100644 --- a/code/game/jobs/server_whitelist.dm +++ b/code/game/jobs/server_whitelist.dm @@ -31,7 +31,7 @@ var/global/list/server_whitelist to_file(write_file, jointext(global.server_whitelist, "\n")) var/global/list/alien_whitelist = list() -/hook/startup/proc/loadAlienWhitelist() +/proc/try_load_alien_whitelist() if(get_config_value(/decl/config/toggle/use_alien_whitelist)) if(get_config_value(/decl/config/toggle/use_alien_whitelist_sql)) if(!load_alienwhitelistSQL()) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 16353f9bf476..55054da3de1e 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -38,7 +38,7 @@ if(IS_WIRECUTTER(O)) if(cable && cable.amount) - var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + var/m = round(input(user,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) m = min(m, cable.amount) m = min(m, 30) if(m) @@ -47,7 +47,7 @@ var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m else - to_chat(usr, "There's no more cable on the reel.") + to_chat(user, "There's no more cable on the reel.") return TRUE return ..() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index dd697812746a..0efbfce6cd4d 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -248,7 +248,7 @@ /obj/machinery/sleeper/CanUseTopic(user) if(user == occupant) - to_chat(usr, SPAN_WARNING("You can't reach the controls from the inside.")) + to_chat(user, SPAN_WARNING("You can't reach the controls from the inside.")) return STATUS_CLOSE . = ..() diff --git a/code/game/machinery/_machines_base/machine_construction/_construction.dm b/code/game/machinery/_machines_base/machine_construction/_construction.dm index 26a364d9d8fb..fa819a58c1a6 100644 --- a/code/game/machinery/_machines_base/machine_construction/_construction.dm +++ b/code/game/machinery/_machines_base/machine_construction/_construction.dm @@ -88,8 +88,8 @@ /decl/machine_construction/proc/attackby(obj/item/I, mob/user, obj/machinery/machine) if(!validate_state(machine)) PRINT_STACK_TRACE("Machine [log_info_line(machine)] violated the state assumptions of the construction state [type]!") - machine.attackby(I, user) - return TRUE + return machine.attackby(I, user) + return FALSE /decl/machine_construction/proc/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm index 52c25f29a99a..835402c5484b 100644 --- a/code/game/machinery/_machines_base/machine_construction/airlock.dm +++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm @@ -9,7 +9,7 @@ playsound(get_turf(machine), 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, SPAN_NOTICE("You release some of the logic wiring on \the [machine]. The cover panel remains closed.")) machine.update_icon() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(down_state) playsound(get_turf(machine), 'sound/items/Crowbar.ogg', 50, 1) @@ -23,6 +23,7 @@ machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/mechanics_info() . = list() @@ -40,6 +41,7 @@ to_chat(user, SPAN_NOTICE("You tuck the exposed wiring back into \the [machine] and screw the hatch back into place.")) machine.queue_icon_update() return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/hacking/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index b2cd2e49d11f..c178a598eb4a 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -30,13 +30,14 @@ machine.panel_open = TRUE to_chat(user, SPAN_NOTICE("You open the maintenance hatch of \the [machine].")) machine.update_icon() - return + return TRUE if(istype(I, /obj/item/part_replacer)) var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/post_construct(obj/machinery/machine) try_change_state(machine, down_state) @@ -75,16 +76,14 @@ machine.panel_open = FALSE to_chat(user, SPAN_NOTICE("You close the maintenance hatch of \the [machine].")) machine.update_icon() - return - + return TRUE if(istype(I, /obj/item/part_replacer)) return machine.part_replacement(user, I) - if(IS_WRENCH(I)) return machine.part_removal(user) - if(istype(I)) return machine.part_insertion(user, I) + return FALSE /decl/machine_construction/default/panel_open/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/frame.dm b/code/game/machinery/_machines_base/machine_construction/frame.dm index 459f90a8fb26..1913c959fbed 100644 --- a/code/game/machinery/_machines_base/machine_construction/frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/frame.dm @@ -30,7 +30,7 @@ TRANSFER_STATE(/decl/machine_construction/default/deconstructed) to_chat(user, "You deconstruct \the [machine].") machine.dismantle() - + return FALSE /decl/machine_construction/frame/unwrenched/mechanics_info() . = list() @@ -49,15 +49,13 @@ try_change_state(machine, /decl/machine_construction/frame/unwrenched) /decl/machine_construction/frame/wrenched/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(IS_WRENCH(I)) playsound(machine.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, machine)) TRANSFER_STATE(/decl/machine_construction/frame/unwrenched) to_chat(user, "You unfasten \the [machine].") machine.anchored = FALSE - return - + return TRUE if(IS_COIL(I)) var/obj/item/stack/cable_coil/C = I if(C.get_amount() < 5) @@ -69,7 +67,7 @@ TRANSFER_STATE(/decl/machine_construction/frame/awaiting_circuit) to_chat(user, "You add cables to the frame.") return TRUE - + return FALSE /decl/machine_construction/frame/wrenched/mechanics_info() . = list() @@ -91,22 +89,22 @@ if(istype(I, /obj/item/stock_parts/circuitboard)) var/obj/item/stock_parts/circuitboard/circuit = I if(circuit.board_type == machine.expected_machine_type) - if(!user.canUnEquip(I)) - return FALSE - TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) - user.try_unequip(I, machine) - playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "You add the circuit board to \the [machine].") - machine.circuit = I - return + if(user.canUnEquip(I)) + TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) + user.try_unequip(I, machine) + playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You add the circuit board to \the [machine].") + machine.circuit = I else to_chat(user, "This frame does not accept circuit boards of this type!") - return TRUE + return TRUE if(IS_WIRECUTTER(I)) TRANSFER_STATE(/decl/machine_construction/frame/wrenched) playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You remove the cables.") new /obj/item/stack/cable_coil(machine.loc, 5) + return TRUE + return FALSE /decl/machine_construction/frame/awaiting_circuit/mechanics_info() . = list() @@ -131,7 +129,7 @@ machine.circuit.dropInto(machine.loc) machine.circuit = null to_chat(user, "You remove the circuit board.") - return + return TRUE if(IS_SCREWDRIVER(I)) playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/new_machine = new machine.circuit.build_path(machine.loc, machine.dir, FALSE) @@ -145,6 +143,7 @@ PRINT_STACK_TRACE("Machine of type [new_machine.type] was built from a circuit and frame, but had no construct state set.") qdel(machine) return TRUE + return FALSE /decl/machine_construction/frame/awaiting_parts/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm index f395d35b1b91..234319a1bca2 100644 --- a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm +++ b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm @@ -11,7 +11,7 @@ playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE return ..() /decl/machine_construction/default/panel_closed/item_chassis/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm index 023bbbc699f2..e050c23ff8f3 100644 --- a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm @@ -78,7 +78,7 @@ new /obj/item/stack/cable_coil(get_turf(machine), 5) machine.set_broken(TRUE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return + return TRUE if((. = up_interaction(I, user, machine))) return @@ -135,10 +135,9 @@ to_chat(user, SPAN_NOTICE("You wire the [machine].")) machine.set_broken(FALSE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return else to_chat(user, SPAN_WARNING("You need five pieces of cable to wire \the [machine].")) - return TRUE + return TRUE if((. = down_interaction(I, user, machine))) return @@ -200,14 +199,16 @@ machine.install_component(board) user.visible_message(SPAN_NOTICE("\The [user] inserts \the [board] into \the [machine]!"), SPAN_NOTICE("You insert \the [board] into \the [machine]!")) machine.queue_icon_update() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(/decl/machine_construction/default/deconstructed) playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE + + return FALSE /decl/machine_construction/wall_frame/no_circuit/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index 379a5dea9479..d775b0e80706 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -255,8 +255,8 @@ var/global/list/machine_path_to_circuit_type /obj/machinery/proc/component_stat_change(var/obj/item/stock_parts/part, old_stat, flag) /obj/machinery/attackby(obj/item/I, mob/user) - if(component_attackby(I, user)) - return TRUE + if((. = component_attackby(I, user))) + return return ..() /obj/machinery/proc/component_attackby(obj/item/I, mob/user) @@ -265,7 +265,7 @@ var/global/list/machine_path_to_circuit_type continue if((. = part.attackby(I, user))) return - return construct_state && construct_state.attackby(I, user, src) + return construct_state?.attackby(I, user, src) /obj/machinery/proc/component_attack_hand(mob/user) for(var/obj/item/stock_parts/part in component_parts) diff --git a/code/game/machinery/_machines_base/stock_parts/network_lock.dm b/code/game/machinery/_machines_base/stock_parts/network_lock.dm index ca74dc094445..540984384085 100644 --- a/code/game/machinery/_machines_base/stock_parts/network_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/network_lock.dm @@ -183,7 +183,7 @@ if(href_list["add_pattern"]) if(length(groups) >= MAX_PATTERNS) - to_chat(usr, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) + to_chat(user, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) return TOPIC_HANDLED LAZYADD(groups, list(list())) return TOPIC_REFRESH diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index a08744dd2515..b9664324917c 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -221,7 +221,7 @@ return TOPIC_REFRESH if(href_list["set_input_tag"]) - var/t = sanitize_safe(input(usr, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.input_tag = t @@ -229,7 +229,7 @@ return TOPIC_REFRESH if(href_list["set_output_tag"]) - var/t = sanitize_safe(input(usr, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.output_tag = t @@ -237,7 +237,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_tag"]) - var/t = sanitize_safe(input(usr, "Enter the sensor ID tag.", src.name, src.sensor_tag)) + var/t = sanitize_safe(input(user, "Enter the sensor ID tag.", src.name, src.sensor_tag)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_tag = t @@ -245,7 +245,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_name"]) - var/t = sanitize_safe(input(usr, "Enter the sensor name.", src.name, src.sensor_name)) + var/t = sanitize_safe(input(user, "Enter the sensor name.", src.name, src.sensor_name)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_name = t diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index e6eb56094761..f9583f4acfc1 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -79,45 +79,53 @@ return SPAN_NOTICE("You must turn \the [src] off first.") return ..() -/obj/machinery/biogenerator/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return +/obj/machinery/biogenerator/attackby(var/obj/item/used_item, var/mob/user) + if(processing) - to_chat(user, "\The [src] is currently processing.") - if(istype(O, /obj/item/chems/glass)) + if((. = component_attackby(used_item, user))) + return + to_chat(user, SPAN_WARNING("\The [src] is currently processing.")) + return TRUE + + if(istype(used_item, /obj/item/chems/glass)) if(beaker) - to_chat(user, "]\The [src] is already loaded.") - return TRUE - else if(user.try_unequip(O, src)) - beaker = O + to_chat(user, SPAN_NOTICE("\The [src] is already loaded.")) + else if(user.try_unequip(used_item, src)) + beaker = used_item state = BG_READY updateUsrDialog() - return TRUE + return TRUE if(ingredients >= capacity) - to_chat(user, "\The [src] is already full! Activate it.") - else if(isobj(O)) - if(O.storage) - var/hadPlants = 0 - for(var/obj/item/food/grown/G in O.storage.get_contents()) - hadPlants = 1 - O.storage.remove_from_storage(user, G, src, TRUE) - ingredients++ - if(ingredients >= capacity) - to_chat(user, "You fill \the [src] to its capacity.") - break - O.storage.finish_bulk_removal() //Now do the UI stuff once. - if(!hadPlants) - to_chat(user, "\The [O] has no produce inside.") - else if(ingredients < capacity) - to_chat(user, "You empty \the [O] into \the [src].") - - else if(!istype(O, /obj/item/food/grown)) - to_chat(user, "You cannot put this in \the [src].") - else if(user.try_unequip(O, src)) + to_chat(user, SPAN_NOTICE("\The [src] is already full! Activate it.")) + return TRUE + + if(used_item.storage) + var/added_plants = FALSE + for(var/obj/item/food/grown/G in used_item.storage.get_contents()) + added_plants = TRUE + used_item.storage.remove_from_storage(user, G, src, TRUE) + ingredients++ + if(ingredients >= capacity) + to_chat(user, SPAN_NOTICE("You fill \the [src] to its capacity.")) + break + used_item.storage.finish_bulk_removal() //Now do the UI stuff once. + if(!added_plants) + to_chat(user, SPAN_WARNING("\The [used_item] has no produce inside.")) + else if(ingredients < capacity) + to_chat(user, SPAN_NOTICE("You empty \the [used_item] into \the [src].")) + return TRUE + + if(!istype(used_item, /obj/item/food/grown)) + to_chat(user, SPAN_WARNING("You cannot put this in \the [src].")) + return TRUE + + if(user.try_unequip(used_item, src)) ingredients++ - to_chat(user, "You put \the [O] in \the [src]") - update_icon() + to_chat(user, SPAN_NOTICE("You put \the [used_item] in \the [src]")) + return TRUE + + return ..() /** * Display the NanoUI window for the vending machine. @@ -160,7 +168,7 @@ /obj/machinery/biogenerator/OnTopic(user, href_list) switch (href_list["action"]) if("activate") - activate() + activate(user) if("detach") if(beaker) beaker.dropInto(src.loc) @@ -186,8 +194,8 @@ ui_interact(user) return TRUE -/obj/machinery/biogenerator/proc/activate() - if (usr.stat) +/obj/machinery/biogenerator/proc/activate(mob/user) + if (user.incapacitated()) return if (stat) //NOPOWER etc return diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 0042bac3abbd..d1a10d81ea00 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -149,33 +149,32 @@ /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) if(!istype(target)) return - var/mob/living/silicon/ai/U = usr - if(target == U.cameraFollow) + if(target == cameraFollow) return - if(U.cameraFollow) - U.ai_cancel_tracking() - U.cameraFollow = target - to_chat(U, "Tracking target...") + if(cameraFollow) + ai_cancel_tracking() + cameraFollow = target + to_chat(src, "Tracking target...") target.tracking_initiated() spawn (0) - while (U.cameraFollow == target) - if (U.cameraFollow == null) + while (cameraFollow == target) + if (cameraFollow == null) return switch(target.tracking_status()) if(TRACKING_NO_COVERAGE) - to_chat(U, "Target is not near any active cameras.") + to_chat(src, "Target is not near any active cameras.") sleep(100) continue if(TRACKING_TERMINATE) - U.ai_cancel_tracking(1) + ai_cancel_tracking(1) return - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target), 0) + if(eyeobj) + eyeobj.setLoc(get_turf(target), 0) else view_core() return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 37ac6e0d729a..af53c701163e 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -34,7 +34,7 @@ to_chat(usr, SPAN_NOTICE("Issuing reason: [reason].")) /obj/item/card/id/guest/proc/expire() - color = COLOR_BLACK + set_color(COLOR_BLACK) detail_color = COLOR_BLACK update_icon() diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 11c41dca7caf..df5391cc06d8 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -19,7 +19,7 @@ update_icon() /obj/machinery/constructable_frame/dismantle() - SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/strut) + SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/rods) qdel(src) return TRUE diff --git a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm index f187d98f09c3..dabbb7680fbb 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm @@ -132,12 +132,12 @@ if(href_list["input_tag"]) var/new_tag = input(user, "Enter the tag of the controller to connect to.", "Tag Selection", terminal.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH if(istext(href_list["set_tag"])) var/new_tag = href_list["set_tag"] @@ -145,6 +145,6 @@ if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index bfdbc356c448..2f893501f6e8 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -174,20 +174,20 @@ if(href_list["set_tag"]) var/new_tag = input(user, "Enter a new tag to use. Warning: this will reset all tags used by this machine, not just the main one!", "Tag Selection", controller.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) controller.reset_id_tags(new_tag) controller.set_frequency(controller.frequency) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["set_freq"]) var/new_frequency = input(user, "Enter a new frequency to use.", "frequency Selection", controller.frequency) as num|null if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) controller.set_frequency(new_frequency) - return MT_REFRESH + return TOPIC_REFRESH /decl/stock_part_preset/radio/receiver/vent_pump/airlock frequency = EXTERNAL_AIR_FREQ diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 6d804caa374a..b8628b7e508a 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -41,7 +41,7 @@ var/m = input("Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] - user.visible_message("[usr] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") + user.visible_message("[user] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") return TRUE if(istype(W, /obj/item/stack/tile)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index f086a33332b3..47f7eab52117 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -40,7 +40,7 @@ /obj/machinery/igniter/interface_interact(mob/user) if(!CanInteract(user, DefaultTopicState())) return FALSE - ignite() + toggle_igniter() visible_message(SPAN_NOTICE("\The [user] toggles \the [src].")) return TRUE @@ -51,7 +51,7 @@ location.hotspot_expose(1000,500,1) return 1 -/obj/machinery/igniter/proc/ignite() +/obj/machinery/igniter/proc/toggle_igniter() use_power_oneoff(2000) on = !on if(on) @@ -73,7 +73,7 @@ /decl/public_access/public_method/igniter_toggle name = "igniter toggle" desc = "Toggle the igniter on or off." - call_proc = TYPE_PROC_REF(/obj/machinery/igniter, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/igniter, toggle_igniter) /decl/stock_part_preset/radio/receiver/igniter frequency = BUTTON_FREQ @@ -133,19 +133,15 @@ return ..() /obj/machinery/sparker/attack_ai() - if (anchored) - return ignite() - else - return + return anchored ? create_sparks() : null -/obj/machinery/sparker/proc/ignite() +/obj/machinery/sparker/proc/create_sparks() if (stat & NOPOWER) return if (disable || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) spark_at(src, amount=2, cardinal_only = TRUE) src.last_spark = world.time @@ -159,13 +155,13 @@ if(stat & (BROKEN|NOPOWER)) ..(severity) return - ignite() + create_sparks() ..(severity) /decl/public_access/public_method/sparker_spark name = "spark" desc = "Creates sparks to ignite nearby gases." - call_proc = TYPE_PROC_REF(/obj/machinery/sparker, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/sparker, create_sparks) /decl/stock_part_preset/radio/receiver/sparker frequency = BUTTON_FREQ diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 6351cca16c77..1fb6b7666b72 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -110,7 +110,7 @@ if(emagged) emag_play() else if(!current_track) - to_chat(usr, "No track selected.") + to_chat(user, "No track selected.") else StartPlaying() return TOPIC_REFRESH diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 632c1458349c..bda3e44c704c 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -415,20 +415,20 @@ ffuu.add_to_reagents(/decl/material/liquid/acrylamide, amount/10) return ffuu -/obj/machinery/microwave/OnTopic(href, href_list) +/obj/machinery/microwave/OnTopic(mob/user, href_list) switch(href_list["action"]) if ("cook") cook() return TOPIC_REFRESH if ("dispose") - dispose(usr) + dispose(user) return TOPIC_REFRESH if ("ejectitem") for(var/obj/O in get_contained_external_atoms()) if(strip_improper(O.name) == href_list["target"]) - eject_item(usr, O) + eject_item(user, O) break return TOPIC_REFRESH @@ -437,7 +437,7 @@ for(var/material_type in reagents.reagent_volumes) mat = GET_DECL(material_type) if(mat.name == href_list["target"]) - eject_reagent(usr, material_type) + eject_reagent(user, material_type) break return TOPIC_REFRESH diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm deleted file mode 100644 index 87285e914033..000000000000 --- a/code/game/machinery/magnet.dm +++ /dev/null @@ -1,391 +0,0 @@ -// Magnetic attractor, creates variable magnetic fields and attraction. -// Can also be used to emit electron/proton beams to create a center of magnetism on another tile - -// tl;dr: it's magnets lol -// This was created for firing ranges, but I suppose this could have other applications - Doohl - -var/global/list/magnetic_modules = list() - -/obj/machinery/magnetic_module - - icon = 'icons/obj/objects.dmi' - icon_state = "floor_magnet-f" - name = "Electromagnetic Generator" - desc = "A device that uses powernet to create points of magnetic energy." - level = LEVEL_BELOW_PLATING - layer = ABOVE_WIRE_LAYER - anchored = TRUE - idle_power_usage = 50 - - var/freq = 1449 // radio frequency - var/electricity_level = 1 // intensity of the magnetic pull - var/magnetic_field = 1 // the range of magnetic attraction - var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something - var/turf/center // the center of magnetic attraction - var/on = 0 - var/pulling = 0 - - // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down - var/center_x = 0 - var/center_y = 0 - var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - -/obj/machinery/magnetic_module/Initialize() - . = ..() - global.magnetic_modules += src - var/turf/T = loc - if(!T) - return INITIALIZE_HINT_QDEL - hide(!T.is_plating()) - center = T - - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) - - magnetic_process() - - // update the invisibility and icon -/obj/machinery/magnetic_module/hide(var/intact) - set_invisibility(intact ? 101 : 0) - update_icon() - - // update the icon_state -/obj/machinery/magnetic_module/on_update_icon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" - - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" - -/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) - - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) - - Cmd(command, modifier) - - - -/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier) - - if(command) - switch(command) - if("set-electriclevel") - if(modifier) electricity_level = modifier - if("set-magneticfield") - if(modifier) magnetic_field = modifier - - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 - - if("set-x") - if(modifier) center_x = modifier - if("set-y") - if(modifier) center_y = modifier - - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) - - if("set-code") - if(modifier) code = modifier - if("toggle-power") - on = !on - - if(on) - spawn() - magnetic_process() - - - -/obj/machinery/magnetic_module/Process() - if(stat & NOPOWER) - on = 0 - - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 - - - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 - - // Update power usage: - if(on) - update_use_power(POWER_USE_ACTIVE) - change_power_consumption(electricity_level*15, POWER_USE_ACTIVE) - else - update_use_power(POWER_USE_IDLE) - -/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling - set waitfor = FALSE - if(pulling) return - while(on) - - pulling = 1 - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.obj_flags & OBJ_FLAG_CONDUCTIBLE)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(isAI(S)) continue - step_towards(S, center) - - use_power_oneoff(electricity_level * 5) - sleep(13 - electricity_level) - - pulling = 0 - -/obj/machinery/magnetic_module/Destroy() - if(radio_controller) - radio_controller.remove_object(src, freq) - global.magnetic_modules -= src - return ..() - -/obj/machinery/magnetic_controller // TODO: IMPLEMENT OR REMOVE - name = "magnetic control console" - icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING! - icon_state = "airlock_control_off" - density = TRUE - anchored = TRUE - idle_power_usage = 45 - var/frequency = 1449 - var/code = 0 - var/list/magnets = list() - var/title = "Magnetic Control Console" - var/autolink = 0 // if set to 1, can't probe for other magnets! - - var/pathpos = 1 // position in the path - var/path = "NULL" // text path of the magnet - var/speed = 1 // lowest = 1, highest = 10 - var/list/rpath = list() // real path of the magnet, used in iterator - - var/moving = 0 // 1 if scheduled to loop - var/looping = 0 // 1 if looping - - var/datum/radio_frequency/radio_connection - - -/obj/machinery/magnetic_controller/Initialize() - . = ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) - - if(path) // check for default path - filter_path() // renders rpath - - -/obj/machinery/magnetic_controller/Process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - -/obj/machinery/magnetic_controller/interface_interact(user) - interact(user) - return TRUE - -/obj/machinery/magnetic_controller/interact(mob/user) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "[title]

" - if(!autolink) - dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
- "} - - if(magnets.len >= 1) - - dat += "Magnets confirmed:
" - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" - - dat += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" - - - show_browser(user, dat, "window=magnet;size=400x500") - onclose(user, "magnet") - -/obj/machinery/magnetic_controller/Topic(href, href_list) - if(..()) - return 1 - if(stat & (BROKEN|NOPOWER)) - return - usr.set_machine(src) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal - - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness - - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() - - - updateUsrDialog() - -/obj/machinery/magnetic_controller/proc/MagnetMove() - if(looping) return - - while(moving && rpath.len >= 1) - - if(stat & (BROKEN|NOPOWER)) - break - - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - -/obj/machinery/magnetic_controller/proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length - - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list - - // there doesn't HAVE to be separators but it makes paths syntatically visible - -/obj/machinery/magnetic_controller/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) - return ..() \ No newline at end of file diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 75221d302789..50cf312569bd 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -253,7 +253,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Message Body: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -325,7 +325,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="-[MESSAGE.body]
" if(MESSAGE.img) var/resourc_name = "newscaster_photo_[sanitize(viewing_channel.channel_name)]_[i].png" - send_asset(usr.client, resourc_name) + send_asset(user.client, resourc_name) dat+="
" if(MESSAGE.caption) dat+="[MESSAGE.caption]
" @@ -397,7 +397,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -431,7 +431,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [news_network.wanted_issue.body]
" dat+="Photo: " if(news_network.wanted_issue.img) - send_rsc(usr, news_network.wanted_issue.img, "tmp_photow.png") + send_rsc(user, news_network.wanted_issue.img, "tmp_photow.png") dat+="
" else dat+="None" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 27e7d81ea038..dd3da2e44ae5 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -278,7 +278,7 @@ var/global/bomb_set to_chat(usr, "Nothing happens, something might be wrong with the wiring.") return 1 if(!timing && !safety) - start_bomb() + start_bomb(usr) else check_cutoff() if(href_list["safety"]) @@ -306,9 +306,9 @@ var/global/bomb_set to_chat(usr, "There is nothing to anchor to!") return 1 -/obj/machinery/nuclearbomb/proc/start_bomb() +/obj/machinery/nuclearbomb/proc/start_bomb(user) timing = 1 - log_and_message_admins("activated the detonation countdown of \the [src]") + log_and_message_admins("activated the detonation countdown of \the [src]", user) bomb_set++ //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) original_level = security_state.current_security_level @@ -479,11 +479,11 @@ var/global/bomb_set if(href_list["anchor"]) return -/obj/machinery/nuclearbomb/station/start_bomb() +/obj/machinery/nuclearbomb/station/start_bomb(mob/user) for(var/inserter in inserters) var/obj/machinery/self_destruct/sd = inserter if(!istype(sd) || !sd.armed) - to_chat(usr, "An inserter has not been armed or is damaged.") + to_chat(user, "An inserter has not been armed or is damaged.") return visible_message("Warning. The self-destruct sequence override will be disabled [self_destruct_cutoff] seconds before detonation.") ..() diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 27a13a93063a..aeb5ac90cac6 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -185,7 +185,7 @@ /obj/machinery/oxygen_pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(!tank) - to_chat(usr, SPAN_WARNING("It is missing a tank!")) + to_chat(user, SPAN_WARNING("It is missing a tank!")) data["tankPressure"] = 0 data["releasePressure"] = 0 data["defaultReleasePressure"] = 0 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e7f5b123b93c..0124b95786e2 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -193,7 +193,7 @@ var/global/list/turret_icons return STATUS_CLOSE if(!anchored) - to_chat(usr, "\The [src] has to be secured first!") + to_chat(user, "\The [src] has to be secured first!") return STATUS_CLOSE return ..() diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 6bc3d2230d4e..28bcefc71584 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -14,9 +14,6 @@ /obj/machinery/seed_extractor/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return - // Fruits and vegetables. if(istype(O, /obj/item/food/grown)) if(!user.try_unequip(O)) diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm index ee842c32e23a..3cf9137e831f 100644 --- a/code/game/machinery/self_destruct.dm +++ b/code/game/machinery/self_destruct.dm @@ -14,7 +14,7 @@ if(!damaged) return FALSE user.visible_message("[user] begins to repair [src].", "You begin repairing [src].") - if(do_after(usr, 100, src)) + if(do_after(user, 100, src)) var/obj/item/weldingtool/w = W if(w.weld(10)) damaged = 0 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index e59df75a663c..77dcbafee909 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -81,7 +81,7 @@ dat += " [set_temperature]K ([set_temperature-T0C]°C)" dat += "+
" - var/datum/browser/popup = new(usr, "spaceheater", "Space Heater Control Panel") + var/datum/browser/popup = new(user, "spaceheater", "Space Heater Control Panel") popup.set_content(jointext(dat, null)) popup.open() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index e6ce02af3f7b..f48d05b08d79 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -66,13 +66,13 @@ L = locate("landmark*[C.data]") // use old stype if(istype(L, /obj/abstract/landmark) && isturf(L.loc) && user.try_unequip(I)) - to_chat(usr, "You insert the coordinates into the machine.") - to_chat(usr, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") + to_chat(user, "You insert the coordinates into the machine.") + to_chat(user, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") qdel(I) audible_message(SPAN_NOTICE("Locked in.")) src.locked = L one_time_use = 1 - add_fingerprint(usr) + add_fingerprint(user) return TRUE /obj/machinery/computer/teleporter/interface_interact(var/mob/user) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 141619bd14f7..c7c2924326f2 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -89,7 +89,7 @@ return FALSE if(istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) - if(src.allowed(usr)) + if(src.allowed(user)) if(emagged) to_chat(user, "The turret control is unresponsive.") else diff --git a/code/game/machinery/turrets/turret_ammo.dm b/code/game/machinery/turrets/turret_ammo.dm index 7054e5ecf23e..52cf5825df0c 100644 --- a/code/game/machinery/turrets/turret_ammo.dm +++ b/code/game/machinery/turrets/turret_ammo.dm @@ -32,10 +32,10 @@ var/obj/item/ammo_casing/casing = W if(stored_caliber && casing.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [casing] does not match the caliber stored in \the [src]!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE casing.forceMove(src) stored_ammo += casing @@ -49,13 +49,13 @@ var/obj/item/ammo_magazine/magazine = W if(stored_caliber && magazine.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [magazine] does not match the caliber stored in \the [src]!")) - return FALSE + return TRUE if(!length(magazine.stored_ammo)) to_chat(user, SPAN_WARNING("\The [magazine] is empty!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE stored_caliber = magazine.caliber for(var/obj/item/ammo_casing/casing in magazine.stored_ammo) diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index 7f4d8694c6c0..2bc56a9c1051 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -107,7 +107,7 @@ var/category = current_list[2] for(var/entry in current_list[1]) var/datum/stored_items/vending_products/product = new(src, entry) - product.price = atom_info_repository.get_combined_worth_for(entry) * markup + product.price = ceil(atom_info_repository.get_combined_worth_for(entry) * markup) product.category = category if(product && populate_parts) product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1 @@ -213,9 +213,9 @@ if(currently_vending.price > cashmoney.absolute_worth) // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in - to_chat(usr, "[html_icon(cashmoney)] That is not enough money.") + to_chat(usr, SPAN_WARNING("[html_icon(cashmoney)] That is not enough money.")) return 0 - visible_message("\The [usr] inserts some cash into \the [src].") + visible_message(SPAN_INFO("\The [usr] inserts some cash into \the [src].")) cashmoney.adjust_worth(-(currently_vending.price)) // Vending machines have no idea who paid with cash credit_purchase("(cash)") @@ -228,7 +228,7 @@ * successful, 0 if failed. */ /obj/machinery/vending/proc/pay_with_charge_card(var/obj/item/charge_stick/wallet) - visible_message("\The [usr] plugs \the [wallet] into \the [src].") + visible_message(SPAN_INFO("\The [usr] plugs \the [wallet] into \the [src].")) if(wallet.is_locked()) status_message = "Unlock \the [wallet] before using it." status_error = TRUE @@ -327,7 +327,7 @@ if(R.price <= 0) vend(R, user) else if(issilicon(user)) //If the item is not free, provide feedback if a synth is trying to buy something. - to_chat(user, "Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled.") + to_chat(user, SPAN_DANGER("Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled.")) else currently_vending = R if(!vendor_account || vendor_account.suspended) @@ -355,7 +355,7 @@ if(!vend_ready) return if((!allowed(user)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(user, "Access denied.")//Unless emagged of course + to_chat(user, SPAN_WARNING("Access denied."))//Unless emagged of course var/deny_state = "[icon_state]-deny" if(check_state_in_icon(deny_state, icon)) flick(deny_state, src) @@ -390,7 +390,7 @@ if(prob(1)) //The vending gods look favorably upon you sleep(3) if(product.get_product(get_turf(src))) - visible_message("\The [src] clunks as it vends an additional [product.item_name].") + visible_message(SPAN_NOTICE("\The [src] clunks as it vends an additional [product.item_name].")) status_message = "" status_error = 0 vend_ready = 1 @@ -408,7 +408,7 @@ return if(R.add_product(W)) - to_chat(user, "You insert \the [W] in the product receptor.") + to_chat(user, SPAN_NOTICE("You insert \the [W] in the product receptor.")) SSnano.update_uis(src) return 1 @@ -484,5 +484,5 @@ return 0 spawn(0) throw_item.throw_at(target, rand(1,2), 3) - visible_message("\The [src] launches \a [throw_item] at \the [target]!") + visible_message(SPAN_WARNING("\The [src] launches \a [throw_item] at \the [target]!")) return 1 diff --git a/code/game/objects/alien_props.dm b/code/game/objects/alien_props.dm index b6dca18e783c..6297ef140f0b 100644 --- a/code/game/objects/alien_props.dm +++ b/code/game/objects/alien_props.dm @@ -65,8 +65,7 @@ . = ..() if(!random_light_color) random_light_color = get_random_colour(FALSE, 100, 255) - b_color = random_light_color - color = random_light_color + set_color(random_light_color) // if stuff starts exploding due to too-early update_icon calls it's this thing's fault //Airlock /obj/machinery/door/airlock/alien diff --git a/code/game/objects/auras/blueforge_aura.dm b/code/game/objects/auras/blueforge_aura.dm deleted file mode 100644 index ae3925d0e206..000000000000 --- a/code/game/objects/auras/blueforge_aura.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/aura/blueforge_aura - name = "Blueforge Aura" - icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - icon_state = "eyes" - layer = MOB_LAYER - -/obj/aura/blueforge_aura/life_tick() - user.heal_damage(TOX, 10) - return 0 - -/obj/aura/blueforge_aura/bullet_act(var/obj/item/projectile/P) - if(P.atom_damage_type == BURN) - P.damage *=2 - else if(P.agony || P.stun) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/radiant_aura.dm b/code/game/objects/auras/radiant_aura.dm index 0968d0570607..d25cfa807b95 100644 --- a/code/game/objects/auras/radiant_aura.dm +++ b/code/game/objects/auras/radiant_aura.dm @@ -17,4 +17,4 @@ if(P.damage_flags() & DAM_LASER) user.visible_message("\The [P] refracts, bending into \the [user]'s aura.") return AURA_FALSE - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/auras/shadowling_aura.dm b/code/game/objects/auras/shadowling_aura.dm deleted file mode 100644 index ff081f7dfb10..000000000000 --- a/code/game/objects/auras/shadowling_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/aura/shadowling_aura - name = "Shadowling Aura" - var/added_mutation = FALSE - -/obj/aura/shadowling_aura/added_to(var/mob/living/L) - ..() - if(L.add_genetic_condition(GENE_COND_SPACE_RESISTANCE)) - added_mutation = TRUE - -/obj/aura/shadowling_aura/removed() - if(added_mutation) - added_mutation = FALSE - user.remove_genetic_condition(GENE_COND_SPACE_RESISTANCE) - ..() - -/obj/aura/shadowling_aura/bullet_act(var/obj/item/projectile/P) - if(P.damage_flags() & DAM_LASER) - P.damage *= 2 - if(P.agony) - P.agony *= 2 - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/starlight.dm b/code/game/objects/auras/starlight.dm deleted file mode 100644 index 5e6253cbd939..000000000000 --- a/code/game/objects/auras/starlight.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/aura/starborn - name = "starborn's gift" - icon = 'icons/effects/effects.dmi' - icon_state = "white_electricity_constant" - color = "#33cc33" - layer = MOB_LAYER - -/obj/aura/starborn/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(P.atom_damage_type == BURN) - user.visible_message("\The [P] seems to only make \the [user] stronger.") - user.heal_damage(BRUTE, P.damage) - return AURA_FALSE - return 0 - -/obj/aura/starborn/attackby(var/obj/item/I, var/mob/i_user) - if(I.atom_damage_type == BURN) - to_chat(i_user, "\The [I] seems to only feed into \the [user]'s flames.") - user.heal_damage(BRUTE, I.get_attack_force(user)) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index ef76cb068303..ae0c3c0cd9b5 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -9,9 +9,14 @@ alpha = 0 var/dirt_amount = 0 +/obj/effect/decal/cleanable/dirt/visible + dirt_amount = 60 + persistent = FALSE // This is a subtype for mapping. + /obj/effect/decal/cleanable/dirt/Initialize() . = ..() verbs.Cut() + update_icon() /obj/effect/decal/cleanable/dirt/on_update_icon() . = ..() diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7d695e1f75d0..e2e87ae2470e 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -132,18 +132,18 @@ /obj/abstract/landmark/costume/holiday_priest/make_costumes() new /obj/item/clothing/suit/holidaypriest(loc) -/obj/abstract/landmark/costume/marisawizard/fake/make_costumes() - new /obj/item/clothing/head/wizard/marisa/fake(loc) - new/obj/item/clothing/suit/wizrobe/marisa/fake(loc) +/obj/abstract/landmark/costume/marisawizard/make_costumes() + new /obj/item/clothing/head/wizard/marisa(loc) + new/obj/item/clothing/suit/wizrobe/marisa(loc) /obj/abstract/landmark/costume/cutewitch/make_costumes() new /obj/item/clothing/dress/sun(loc) new /obj/item/clothing/head/witchwig(loc) new /obj/item/staff/broom(loc) -/obj/abstract/landmark/costume/fakewizard/make_costumes() - new /obj/item/clothing/suit/wizrobe/fake(loc) - new /obj/item/clothing/head/wizard/fake(loc) +/obj/abstract/landmark/costume/wizard/make_costumes() + new /obj/item/clothing/suit/wizrobe(loc) + new /obj/item/clothing/head/wizard/beard(loc) new /obj/item/staff/(loc) /obj/abstract/landmark/costume/sexyclown/make_costumes() diff --git a/code/game/objects/effects/temporaray.dm b/code/game/objects/effects/temporary.dm similarity index 100% rename from code/game/objects/effects/temporaray.dm rename to code/game/objects/effects/temporary.dm diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 9b3eba8970b1..5081ba6b45d8 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -6,6 +6,9 @@ abstract_type = /obj/item temperature_sensitive = TRUE + /// Set to prefix name with this string ('woven' for 'woven basket' etc) + var/name_prefix + /// Set to false to skip state checking and never draw an icon on the mob (except when held) var/draw_on_mob_when_equipped = TRUE @@ -170,6 +173,19 @@ set_material(material_key) paint_verb ||= "painted" // fallback for the case of no material + // This is a bit gross, but it makes writing rings and necklaces much easier. + // If the decorations list is already populated at this point, we assume it's + // prebaked decorations. + // Only things handled appropriately at the moment are gems and material inlays. + if(length(decorations)) + for(var/decoration_type in decorations) + decorations -= decoration_type + if(ispath(decoration_type, /obj/item/gemstone)) + decorations[GET_DECL(/decl/item_decoration/setting)] = list("object" = new decoration_type(src)) + else if(ispath(decoration_type, /decl/material)) + decorations[GET_DECL(/decl/item_decoration/inset)] = list("material" = GET_DECL(decoration_type)) + else + PRINT_STACK_TRACE("Item [type] tried to initialize with an unsupported initial decoration type ('[decoration_type]')") . = ..() setup_sprite_sheets() @@ -197,6 +213,9 @@ /obj/item/Destroy() + // May contain object references. + LAZYCLEARLIST(decorations) + if(LAZYLEN(_item_effects)) _item_effects = null SSitem_effects.queued_items -= src @@ -300,11 +319,7 @@ var/list/available_recipes = list() for(var/decl/crafting_stage/initial_stage in SSfabrication.find_crafting_recipes(type)) if(initial_stage.can_begin_with(src) && ispath(initial_stage.completion_trigger_type)) - var/atom/movable/prop = initial_stage.completion_trigger_type - if(initial_stage.stack_consume_amount > 1) - available_recipes[initial_stage] = "[initial_stage.stack_consume_amount] [initial(prop.name)]\s" - else - available_recipes[initial_stage] = "\a [initial(prop.name)]" + available_recipes[initial_stage] = initial_stage.generate_completion_string() if(length(available_recipes)) @@ -581,11 +596,6 @@ return ..() -/obj/item/attack_ghost(mob/user) - var/mob/observer/ghost/pronouns = user - if(pronouns.client?.holder || pronouns.antagHUD) - storage?.show_to(user) - /obj/item/proc/talk_into(mob/living/M, message, message_mode, var/verb = "says", var/decl/language/speaking = null) return @@ -1042,16 +1052,38 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. if(item_flags & ITEM_FLAG_IS_BELT) LAZYADD(., slot_belt_str) + // Where are we usually worn? + var/default_slot = get_fallback_slot() + if(default_slot) + LAZYDISTINCTADD(., default_slot) + // Uniforms can show or hide ID. + if(default_slot == slot_w_uniform_str) + LAZYDISTINCTADD(., slot_wear_id_str) + + // Currently this proc is used for clothing updates, so we + // need to care what slot we are being worn in, if any. + if(ismob(loc)) + var/mob/wearer = loc + var/equipped_slot = wearer.get_equipped_slot_for_item(src) + if(equipped_slot) + LAZYDISTINCTADD(., equipped_slot) + // Updates the icons of the mob wearing the clothing item, if any. /obj/item/proc/update_clothing_icon(do_update_icon = TRUE) - var/mob/wearer = loc - if(!istype(wearer)) - return FALSE - var/equip_slots = get_associated_equipment_slots() - if(!islist(equip_slots)) + + // Accessories should pass this back to their holder. + if(isitem(loc)) + var/obj/item/holder = loc + return holder.update_clothing_icon(do_update_icon) + + // If we're not on a mob, we do not care. + if(!ismob(loc)) return FALSE - for(var/slot in equip_slots) - wearer.update_equipment_overlay(slot, FALSE) + + // We refresh our equipped slot and any associated slots that might depend on the state of this slot. + var/mob/wearer = loc + for(var/equipped_slot in get_associated_equipment_slots()) + wearer.update_equipment_overlay(equipped_slot, FALSE) if(do_update_icon) wearer.update_icon() return TRUE diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 95bc6402777c..7aaf5d6bb267 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -104,10 +104,13 @@ queue_icon_update() /obj/item/proc/update_name() + var/list/new_name = list(base_name || initial(name)) if(material_alteration & MAT_FLAG_ALTERATION_NAME) - SetName("[material.adjective_name] [base_name || initial(name)]") - else - SetName(base_name || initial(name)) + new_name.Insert(1, material.adjective_name) + if(name_prefix) + new_name.Insert(1, name_prefix) + if(length(new_name)) + SetName(jointext(new_name, " ")) /obj/item/get_matter_amount_modifier() . = ..() diff --git a/code/game/objects/items/blades/spear_improvised.dm b/code/game/objects/items/blades/spear_improvised.dm index 8739d9ec568b..d9846e8a1a05 100644 --- a/code/game/objects/items/blades/spear_improvised.dm +++ b/code/game/objects/items/blades/spear_improvised.dm @@ -1,4 +1,5 @@ /obj/item/bladed/polearm/spear/improvised + name_prefix = "improvised" material = /decl/material/solid/glass hilt_material = /decl/material/solid/metal/steel guard_material = /decl/material/solid/metal/copper @@ -11,10 +12,6 @@ force_binding_color = pick(global.cable_colors) . = ..(ml, material_key, _hilt_mat, _guard_mat) -/obj/item/bladed/polearm/spear/improvised/update_name() - . = ..() - SetName("improvised [name]") - /obj/item/bladed/polearm/spear/improvised/get_guard_color() return force_binding_color || ..() diff --git a/code/game/objects/items/candelabra.dm b/code/game/objects/items/candelabra.dm new file mode 100644 index 000000000000..1f82ec443aa7 --- /dev/null +++ b/code/game/objects/items/candelabra.dm @@ -0,0 +1,54 @@ +/datum/storage/candelabra + can_hold = list(/obj/item/flame/candle) + storage_slots = 3 + var/static/list/candle_offsets = list( + list("x" = -4, "y" = 17), + list("x" = 1, "y" = 19), + list("x" = 6, "y" = 17) + ) + +/datum/storage/candelabra/can_be_inserted(obj/item/W, mob/user, stop_messages, click_params) + . = ..() && holder && length(holder.get_stored_inventory()) < length(candle_offsets) + +/obj/item/candelabra + name = "candelabra" + desc = "A three-tined candle stand." + icon = 'icons/obj/items/candelabra.dmi' + icon_state = ICON_STATE_WORLD + storage = /datum/storage/candelabra + material = /decl/material/solid/metal/brass + material_alteration = MAT_FLAG_ALTERATION_ALL + +/obj/item/candelabra/attackby(obj/item/used_item, mob/user) + if(!user.check_intent(I_FLAG_HARM) && (used_item.isflamesource() || used_item.get_heat() > T100C)) + for(var/obj/item/flame/candle/candle in contents) + if(!candle.lit && candle.attackby(used_item, user)) + return TRUE + . = ..() + +/obj/item/candelabra/filled/Initialize(ml, material_key) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + . = ..() + update_icon() + +// Workaround for vis_contents propagating color. +/obj/item/candelabra/on_update_icon() + ..() + var/datum/storage/candelabra/candles_storage = storage + if(istype(candles_storage)) + var/i = 1 + for(var/obj/item/flame/candle/candle in get_stored_inventory()) + var/offsets = candles_storage.candle_offsets[i] + candle.set_dir(SOUTH) + for(var/image/candle_overlay in candle.get_sconce_overlay()) + candle_overlay.pixel_x = offsets["x"] + candle_overlay.pixel_y = offsets["y"] + candle_overlay.dir = SOUTH + candle_overlay.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(candle_overlay) + i++ + if(i > length(candles_storage.candle_offsets)) + break + compile_overlays() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 882706ebc6f8..0726d380a410 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -25,10 +25,6 @@ START_PROCESSING(SSobj, src) update_icon() -/obj/item/radio/intercom/wizard - name = "enchanted intercom" - desc = "Talk into this while you ponder your orb." - /obj/item/radio/intercom/raider name = "piratical intercom" desc = "Pirate radio, but not in the usual sense of the word." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e4db86946c2a..2b4353629192 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -227,11 +227,11 @@ return STATUS_CLOSE return ..() -/obj/item/radio/OnTopic(href, href_list) +/obj/item/radio/OnTopic(mob/user, href_list) if((. = ..())) return - usr.set_machine(src) + user.set_machine(src) if(href_list["analog"]) if(can_use_analog) analog = text2num(href_list["analog"]) @@ -258,8 +258,8 @@ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) set_frequency(new_frequency) if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - close_browser(usr, "window=radio") + if(hidden_uplink.check_trigger(user, frequency, traitor_frequency)) + close_browser(user, "window=radio") . = TOPIC_REFRESH else if (href_list["talk"]) toggle_broadcast() @@ -278,14 +278,14 @@ . = TOPIC_REFRESH else if(href_list["spec_freq"]) var freq = href_list["spec_freq"] - if(has_channel_access(usr, freq)) + if(has_channel_access(user, freq)) set_frequency(text2num(freq)) . = TOPIC_REFRESH if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk return TOPIC_HANDLED if(href_list["network_settings"]) var/datum/extension/network_device/D = get_extension(src, /datum/extension/network_device) - D.ui_interact(usr) + D.ui_interact(user) . = TOPIC_HANDLED if(. & TOPIC_REFRESH) SSnano.update_uis(src) diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 52c0cb31cc7b..bee61f2c54c6 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -56,7 +56,7 @@ loc.update_icon() /obj/item/flame/Destroy() - extinguish(null, TRUE) + snuff_out(null, TRUE) return ..() /obj/item/flame/proc/get_available_scents() @@ -115,7 +115,7 @@ return ..() -/obj/item/flame/proc/extinguish(var/mob/user, var/no_message) +/obj/item/flame/proc/snuff_out(mob/user, no_message = FALSE) if(!lit) return FALSE lit = FALSE @@ -147,7 +147,7 @@ return TRUE if(lit && can_manually_extinguish) - extinguish(user) + snuff_out(user) return TRUE return ..() @@ -175,7 +175,7 @@ else check_depth = FLUID_SHALLOW if(fluids.total_volume >= check_depth) - extinguish(no_message = TRUE) + snuff_out(no_message = TRUE) /obj/item/flame/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) . = ..() @@ -205,32 +205,22 @@ if(!other.can_manually_light) other.light(user) -/obj/item/flame/attackby(obj/item/W, mob/user) - - if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (W.isflamesource() || W.get_heat() > T100C)) +/obj/item/flame/attackby(obj/item/used_item, mob/user) + if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (used_item.isflamesource() || used_item.get_heat() > T100C)) light(user) return TRUE - return ..() /obj/item/flame/Process() - if((!waterproof && submerged()) || !expend_fuel(_fuel_spend_amt)) - extinguish() + snuff_out() return PROCESS_KILL - update_icon() - if(istype(loc, /obj/structure/wall_sconce)) - loc.update_icon() - - // TODO: generalized ignition proc - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() - - var/turf/location = get_turf(src) - if(location) - location.hotspot_expose(get_heat(), w_class) + if(loc) + loc.ignite_fire() + var/turf/my_turf = get_turf(src) + if(my_turf) + my_turf.hotspot_expose(get_heat(), w_class) /obj/item/flame/dropped(var/mob/user) //If dropped, put ourselves out @@ -239,7 +229,7 @@ var/turf/location = loc if(istype(location)) location.hotspot_expose(700, 5) - extinguish() + snuff_out() return ..() /obj/item/flame/spark_act(obj/effect/sparks/sparks) diff --git a/code/game/objects/items/flame/flame_candle.dm b/code/game/objects/items/flame/flame_candle.dm index dcf647104f65..906824d52bcd 100644 --- a/code/game/objects/items/flame/flame_candle.dm +++ b/code/game/objects/items/flame/flame_candle.dm @@ -41,7 +41,7 @@ /obj/item/flame/candle/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) if(lit) - . += overlay_image(icon, "[icon_state]-sconce-lit", color = color, flags = RESET_COLOR) + . += overlay_image(icon, "[icon_state]-sconce-lit", color = COLOR_WHITE, flags = RESET_COLOR) /obj/item/flame/candle/on_update_icon() @@ -63,6 +63,9 @@ // TODO: emissives add_overlay(overlay_image(icon, "[icon_state]_lit", flags = RESET_COLOR)) + if(istype(loc, /obj/item/candelabra)) + loc.queue_icon_update() + /obj/item/flame/candle/proc/get_available_colors() return null @@ -83,6 +86,11 @@ /obj/item/flame/candle/get_available_scents() return null +/obj/item/flame/candle/set_dir(ndir) + if(istype(loc, /obj/item/candelabra)) + ndir = SOUTH + . = ..() + /obj/item/flame/candle/scented name = "scented candle" desc = "A candle which releases pleasant-smelling oils into the air when burned." diff --git a/code/game/objects/items/flame/flame_fuelled_lighter.dm b/code/game/objects/items/flame/flame_fuelled_lighter.dm index 7719c082a6fe..2e1e6903bc2a 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter.dm @@ -33,7 +33,7 @@ user.visible_message(SPAN_NOTICE("After a few attempts, \the [user] manages to light \the [src], burning their finger in the process.")) playsound(src.loc, "light_bic", 100, 1, -4) -/obj/item/flame/fuelled/lighter/extinguish(var/mob/user, var/no_message) +/obj/item/flame/fuelled/lighter/snuff_out(mob/user, no_message = FALSE) if(!no_message && user) no_message = TRUE . = ..() diff --git a/code/game/objects/items/flame/flame_matches.dm b/code/game/objects/items/flame/flame_matches.dm index ebaead8790bb..41300c9d1e0b 100644 --- a/code/game/objects/items/flame/flame_matches.dm +++ b/code/game/objects/items/flame/flame_matches.dm @@ -23,7 +23,7 @@ /obj/item/flame/match/light(mob/user, no_message) . = !burnt && ..() -/obj/item/flame/match/extinguish(var/mob/user, var/no_message) +/obj/item/flame/match/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && !burnt) _fuel = 0 diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 66aac1847d65..26f616a4a47c 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -50,7 +50,7 @@ update_icon() -/obj/item/flame/torch/extinguish(var/mob/user, var/no_message) +/obj/item/flame/torch/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && _fuel <= 0 && !burnt) burnt = TRUE diff --git a/code/game/objects/items/flashlights/glowstick.dm b/code/game/objects/items/flashlights/glowstick.dm index 689fd0a7eb82..c0f07103a330 100644 --- a/code/game/objects/items/flashlights/glowstick.dm +++ b/code/game/objects/items/flashlights/glowstick.dm @@ -43,5 +43,5 @@ color = "#ff00ff" /obj/item/flashlight/flare/glowstick/random/Initialize() - color = rgb(rand(50,255),rand(50,255),rand(50,255)) + set_color(rgb(rand(50,255),rand(50,255),rand(50,255))) . = ..() diff --git a/code/game/objects/items/hourglass.dm b/code/game/objects/items/hourglass.dm index f12a51077f56..98bb75f12811 100644 --- a/code/game/objects/items/hourglass.dm +++ b/code/game/objects/items/hourglass.dm @@ -1,7 +1,5 @@ -// I considered just putting this in the fantasy modpack, -// but it's probably better in core code, since at the very least -// the Wizard gamemode might want to use the item or icon for something. -// Also, I think it could just be a neat prop. +// I considered just putting this in the fantasy modpack, but +// it's probably better in core code, since it's a nice prop. /obj/item/hourglass name = "hourglass" icon = 'icons/obj/items/hourglass.dmi' diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm deleted file mode 100644 index 18dce99c9e59..000000000000 --- a/code/game/objects/items/shooting_range.dm +++ /dev/null @@ -1,142 +0,0 @@ -// Targets, the things that actually get shot! -/obj/item/target - name = "shooting target" - desc = "A shooting target." - icon = 'icons/obj/objects.dmi' - icon_state = "target_h" - density = FALSE - material = /decl/material/solid/organic/plastic - var/obj/structure/target_stake/stake - var/hp = 1800 - var/icon/virtualIcon - var/list/bulletholes = list() - -/obj/item/target/Destroy() - . = ..() - if (stake) - stake.set_target(null) - -/obj/item/target/attackby(var/obj/item/W, var/mob/user) - if(IS_WELDER(W)) - var/obj/item/weldingtool/WT = W - if(WT.weld(0, user)) - overlays.Cut() - bulletholes.Cut() - hp = initial(hp) - to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") - return TRUE - return ..() - -/obj/item/target/attack_hand(var/mob/user) - // taking pinned targets off! - if(!stake || !user.check_dexterity(DEXTERITY_HOLD_ITEM)) - return ..() - return stake.attack_hand(user) - -/obj/item/target/syndicate - icon_state = "target_s" - desc = "A shooting target that looks like a hostile agent." - hp = 2600 // i guess syndie targets are sturdier? -/obj/item/target/alien - icon_state = "target_q" - desc = "A shooting target with a threatening silhouette." - hp = 2350 // alium onest too kinda - -/obj/item/target/bullet_act(var/obj/item/projectile/Proj) - var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!" - var/p_y = Proj.p_y + pick(0,0,0,0,0,-1,1) - var/decaltype = 1 // 1 - scorch, 2 - bullet - - if(istype(/obj/item/projectile/bullet, Proj)) - decaltype = 2 - - - virtualIcon = new(icon, icon_state) - - if( virtualIcon.GetPixel(p_x, p_y) ) // if the located pixel isn't blank (null) - - hp -= Proj.damage - if(hp <= 0) - visible_message(SPAN_WARNING("\The [src] breaks into tiny pieces and collapses!")) - qdel(src) - - // Create a temporary object to represent the damage - var/obj/bmark = new - bmark.pixel_x = p_x - bmark.pixel_y = p_y - bmark.icon = 'icons/effects/effects.dmi' - bmark.layer = ABOVE_OBJ_LAYER - bmark.icon_state = "scorch" - - if(decaltype == 1) - // Energy weapons are hot. they scorch! - - // offset correction - bmark.pixel_x-- - bmark.pixel_y-- - - if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice)) - bmark.icon_state = "scorch" - bmark.set_dir(pick(NORTH,SOUTH,EAST,WEST)) // random scorch design - - - else - bmark.icon_state = "light_scorch" - else - - // Bullets are hard. They make dents! - bmark.icon_state = "dent" - - if(Proj.damage >= 10 && bulletholes.len <= 35) // maximum of 35 bullet holes - if(decaltype == 2) // bullet - if(prob(Proj.damage+30)) // bullets make holes more commonly! - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - else // Lasers! - if(prob(Proj.damage-10)) // lasers make holes less commonly - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - - // draw bullet holes - for(var/datum/bullethole/B in bulletholes) - - virtualIcon.DrawBox(null, B.b1x1, B.b1y, B.b1x2, B.b1y) // horizontal line, left to right - virtualIcon.DrawBox(null, B.b2x, B.b2y1, B.b2x, B.b2y2) // vertical line, top to bottom - - overlays += bmark // add the decal - - icon = virtualIcon // apply bulletholes over decals - - return - - return PROJECTILE_CONTINUE // the bullet/projectile goes through the target! - - -// Small memory holder entity for transparent bullet holes -/datum/bullethole - // First box - var/b1x1 = 0 - var/b1x2 = 0 - var/b1y = 0 - - // Second box - var/b2x = 0 - var/b2y1 = 0 - var/b2y2 = 0 - -/datum/bullethole/New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0) - if(!Target) return - - // Randomize the first box - b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4) - b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4) - b1y = pixel_y - if(prob(35)) - b1y += rand(-4,4) - - // Randomize the second box - b2x = pixel_x - if(prob(35)) - b2x += rand(-4,4) - b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) - b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) - - Target.bulletholes.Add(src) \ No newline at end of file diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 86363f815e9c..7e244c18453f 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,45 +1,37 @@ /obj/item/stack/material/rods - name = "rod" - desc = "Some rods. Can be used for building, or something." - singular_name = "rod" - plural_name = "rods" - icon_state = "rod" - plural_icon_state = "rod-mult" - max_icon_state = "rod-max" - w_class = ITEM_SIZE_LARGE - attack_cooldown = 21 + name = "rod" + desc = "Some rods. Can be used for building, or something." + singular_name = "rod" + plural_name = "rods" + icon_state = "rod" + plural_icon_state = "rod-mult" + max_icon_state = "rod-max" + w_class = ITEM_SIZE_LARGE + attack_cooldown = 21 melee_accuracy_bonus = -20 - throw_speed = 5 - throw_range = 20 - max_amount = 100 - attack_verb = list("hit", "bludgeoned", "whacked") - lock_picking_level = 3 - matter_multiplier = 0.3 - material = /decl/material/solid/metal/steel - is_spawnable_type = TRUE - - pickup_sound = 'sound/foley/tooldrop3.ogg' - drop_sound = 'sound/foley/tooldrop2.ogg' + throw_speed = 5 + throw_range = 20 + max_amount = 100 + attack_verb = list("hit", "bludgeoned", "whacked") + lock_picking_level = 3 + matter_multiplier = 0.3 + material = /decl/material/solid/metal/steel + crafting_stack_type = /obj/item/stack/material/rods + pickup_sound = 'sound/foley/tooldrop3.ogg' + drop_sound = 'sound/foley/tooldrop2.ogg' /obj/item/stack/material/rods/get_autopsy_descriptors() . = ..() . += "narrow" -/obj/item/stack/material/rods/ten - amount = 10 - -/obj/item/stack/material/rods/fifty - amount = 50 - /obj/item/stack/material/rods/cyborg - name = "metal rod synthesizer" - desc = "A device that makes metal rods." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE + name = "metal rod synthesizer" + desc = "A device that makes metal rods." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(500) + max_health = ITEM_HEALTH_NO_DAMAGE /obj/item/stack/material/rods/Initialize() . = ..() @@ -54,12 +46,14 @@ else icon_state = base_state +// TODO: slapcrafting recipes to replace this block. /obj/item/stack/material/rods/attackby(obj/item/W, mob/user) + if(IS_WELDER(W)) var/obj/item/weldingtool/WT = W if(!can_use(2)) - to_chat(user, "You need at least two rods to do this.") + to_chat(user, SPAN_WARNING("You need at least two rods to do this.")) return TRUE if(WT.weld(0,user)) @@ -87,8 +81,3 @@ src.use(1) return TRUE return ..() - -/obj/item/stack/material/rods/attack_self(mob/user) - add_fingerprint(user) - if(isturf(user.loc)) - place_grille(user, user.loc, src) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2a38b4f01c33..2010f99039de 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -53,7 +53,6 @@ update_name() /obj/item/stack/update_name() - . = ..() if(amount == 1) gender = NEUTER SetName(singular_name) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index a7fb3d8aa6e1..02e51277a757 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -216,7 +216,6 @@ /obj/item/stack/tile/carpet/on_update_icon() . = ..() - color = get_color() if(detail_color) set_overlays(overlay_image(icon, "[icon_state]-detail", detail_color, RESET_COLOR)) diff --git a/code/game/objects/items/training_dummy.dm b/code/game/objects/items/training_dummy.dm new file mode 100644 index 000000000000..d870699ddd1d --- /dev/null +++ b/code/game/objects/items/training_dummy.dm @@ -0,0 +1,176 @@ +// Used in conjunction with /obj/structure/target_stake. +/obj/item/training_dummy + name = "shooting target" + desc = "A shooting target." + icon = 'icons/obj/items/training_dummies/standard.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/metal/aluminium + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + max_health = 1800 + appearance_flags = KEEP_TOGETHER // Needed for BLEND_INSET_OVERLAY on the decals. + + // Burn/bullet hole/dent decals to apply to our icon. + var/list/decals + var/const/MAX_DECALS = 250 + + // Very crude bounding box; we do pixel-precise checking within these ranges. + var/decal_min_x = 7 + var/decal_min_y = 3 + var/decal_range_x = 17 + var/decal_range_y = 25 + +/obj/item/training_dummy/proc/get_damage_decal_icon() + return 'icons/obj/items/training_dummies/damage.dmi' + +// Can't repair cloth, straw or plastic targets currently. +/obj/item/training_dummy/proc/can_repair_with(obj/item/thing) + return IS_WELDER(thing) && istype(material, /decl/material/solid/metal) + +/obj/item/training_dummy/proc/perform_repair(mob/user, obj/item/tool) + var/obj/item/weldingtool/welder = tool + if(!istype(welder) || !welder.isOn()) + to_chat(user, SPAN_WARNING("Turn \the [welder] on first.")) + return FALSE + return tool.do_tool_interaction(TOOL_WELDER, user, src, 2 SECONDS) + +/obj/item/training_dummy/proc/repair_target_dummy(obj/item/used_item, mob/user) + + if(!can_repair_with(used_item)) + return FALSE + + var/max_health = get_max_health() + if(current_health >= max_health) + to_chat(user, SPAN_NOTICE("\The [src] doesn't need repairs.")) + return TRUE + + if(perform_repair(user, used_item)) + current_health += rand(100,200) // They have a lot of HP. + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + current_health = get_max_health() + LAZYCLEARLIST(decals) + else + var/remove_decal = pick(decals) + LAZYREMOVE(decals, remove_decal) + update_icon() + return TRUE + + return FALSE + +/obj/item/training_dummy/attackby(obj/item/used_item, mob/user) + if(repair_target_dummy(used_item, user)) + return TRUE + return ..() + +/obj/item/training_dummy/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + + var/old_health = current_health + . = ..() + if(QDELETED(src) || old_health == current_health) + return + + if(damage <= 0) + update_icon() + return + + if(LAZYLEN(decals) >= MAX_DECALS) + return + + var/decal_icon = get_damage_decal_icon() + if(!decal_icon) + return + + var/decal_state + if(damage_type == BURN) + if(damage < 10) + decal_state = "light_scorch" + else + decal_state = "scorch" + else if(damage_type == BRUTE) + if(damage < 10) + decal_state = "dent" + else + decal_state = "bhole" + else + return + + var/image/new_decal = image(decal_icon, decal_state) + new_decal.blend_mode = BLEND_INSET_OVERLAY + new_decal = apply_decal_offsets(new_decal) + if(new_decal) + LAZYADD(decals, new_decal) + update_icon() + +/obj/item/training_dummy/proc/apply_decal_offsets(image/decal) + + // Static list cache for this broke immediately, so seems like we need a fresh icon every time. + // At least it isn't being assigned anywhere so shouldn't cause network overhead. + var/icon/check_icon = icon(icon, icon_state) + if(!check_icon) + return + + var/use_pixel_x + var/use_pixel_y + var/sanity = 100 + while(sanity) + sanity-- + use_pixel_x = decal_min_x + rand(decal_range_x) + use_pixel_y = decal_min_y + rand(decal_range_y) + var/check_pixel = check_icon.GetPixel(use_pixel_x, use_pixel_y) + // Pixel has a colour and no alpha component; we are good. + if(istext(check_pixel) && length(check_pixel) == 7) + break + + if(!sanity || !isnum(use_pixel_x) || use_pixel_x < 0 || !isnum(use_pixel_y) || use_pixel_y < 0) + return + + decal.pixel_x = use_pixel_x + decal.pixel_y = use_pixel_y + return decal + +/obj/item/training_dummy/on_update_icon() + . = ..() + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + LAZYCLEARLIST(decals) + else + set_overlays(decals.Copy()) + if(istype(loc, /obj/structure/target_stake)) + compile_overlays() // We need to update our loc immediately. + loc.update_icon() + +/obj/item/training_dummy/syndicate + icon = 'icons/obj/items/training_dummies/syndicate.dmi' + desc = "A shooting target that looks like a hostile agent." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/alien + icon = 'icons/obj/items/training_dummies/alien.dmi' + desc = "A shooting target with a threatening silhouette." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/straw + name = "training dummy" + icon = 'icons/obj/items/training_dummies/straw.dmi' + desc = "A roughly humanoid shape used for melee practice." + material = /decl/material/solid/organic/plantmatter/grass/dry + material_alteration = MAT_FLAG_ALTERATION_ALL + decal_min_x = 8 + decal_min_y = 12 + decal_range_x = 16 + decal_range_y = 17 + +/obj/item/training_dummy/straw/archery + name = "archery butt" + icon = 'icons/obj/items/training_dummies/archery.dmi' + desc = "A thick circular mat used for archery practice." + decal_min_x = 7 + decal_min_y = 5 + decal_range_x = 19 + decal_range_y = 21 diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 75851fa02dae..37020adb925d 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -131,7 +131,7 @@ if(choice && CanUseTopic(user, state)) src.icon_state = choice.icon_state src.item_state = choice.item_state - src.color = choice.color + set_color(choice.color) src.detail_color = choice.detail_color src.extra_details = choice.extra_details update_icon() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 61ddcccfbaed..cc1018b16393 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -296,7 +296,7 @@ target.create_fire(tank.air_contents.temperature * 2 + 400) target.hotspot_expose(1000, 100) for(var/mob/living/M in target) - M.IgniteMob(1) + M.ignite_fire() // slightly weird looking initialize cuz it has to do some stuff first /obj/item/flamethrower/full/Initialize() diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index fe6ac6673c97..41b4cae00d92 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -34,7 +34,7 @@ var/obj/item/clothing/mask/smokable/cigarette/cig = W if (cig.lit == 1) visible_message(SPAN_NOTICE("\The [user] crushes \the [cig] in \the [src], putting it out.")) - W = cig.extinguish(no_message = 1) + W = cig.extinguish_fire(no_message = TRUE) else if (cig.lit == 0) to_chat(user, SPAN_NOTICE("You place \the [cig] in \the [src] without even smoking it. Why would you do that?")) else diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 0f7ba375f552..dd248df7bb77 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -51,12 +51,8 @@ /obj/item/shard/on_update_icon() . = ..() - if(material) - // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity - alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity)) - else - color = "#ffffff" - alpha = 255 + // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity + alpha = 255 * (material ? (1 - (1 - material.opacity)**2) : 1) /obj/item/shard/attackby(obj/item/W, mob/user) if(IS_WELDER(W) && material.shard_can_repair) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm deleted file mode 100644 index 0b513dc546ac..000000000000 --- a/code/game/objects/items/weapons/scrolls.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/item/paper/scroll/teleportation - name = "scroll of teleportation" - desc = "A scroll for moving around." - origin_tech = @'{"wormholes":4}' - info = {" - Teleportation Scroll:
-
- Comes with four charges! Use them wisely.
- Kind regards,
Wizards Federation

P.S. Don't forget to bring your gear, you'll need it to cast most spells. - "} - var/uses = 4 - -/obj/item/paper/scroll/teleportation/examine(mob/user, distance) - . = ..() - if(distance <= 1) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.is_antagonist(user.mind)) - to_chat(user, SPAN_NOTICE("\The [src] has [uses] charge\s remaining.")) - -/obj/item/paper/scroll/teleportation/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, SPAN_WARNING("You stare at \the [src], but cannot make sense of the markings!")) - return TRUE - if(alert(user, "Do you wish to teleport using \the [src]? It has [uses] charge\s remaining.", "Scroll of Teleportation", "No", "Yes") == "Yes") - teleportscroll(user) - return TRUE - -/obj/item/paper/scroll/teleportation/proc/teleportscroll(var/mob/user) - if(uses <= 0) - return - - var/area/thearea = input(user, "Select an area to jump to.", "Scroll of Teleportation") as null|anything in wizteleportlocs - if(!thearea || QDELETED(src) || QDELETED(user) || user.get_active_held_item() != src || CanUseTopic(user) != STATUS_INTERACTIVE) - return - - thearea = thearea ? wizteleportlocs[thearea] : thearea - if(!thearea) - return - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - var/turf/end = user.try_teleport(thearea) - if(!end) - to_chat(user, SPAN_WARNING("The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry!")) - return - smoke.start() - src.uses -= 1 diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 41ce83c34304..f355815734bd 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -42,9 +42,8 @@ return TRUE return ..() -// TODO: move back into wizard modpack when the timelines converge. /obj/item/staff/crystal - name = "wizard's staff" + name = "crystal staff" icon = 'icons/obj/items/staff_crystal.dmi' /obj/item/staff/crystal/can_make_broom_with(mob/user, obj/item/thing) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 6b9c600b9594..14a20b4125c1 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -445,3 +445,17 @@ name = "security messenger bag" desc = "A tactical backpack worn over one shoulder. This one is in Security colors." icon = 'icons/obj/items/storage/backpack/messenger_sec.dmi' + +// Crafted backpacks. +/obj/item/backpack/crafted + name = "haversack" + desc = "A rather rough handmade haversack." + icon = 'icons/obj/items/storage/backpack/backpack_haversack.dmi' + material = /decl/material/solid/organic/leather + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + +/obj/item/backpack/crafted/backpack + name = "backpack" + name_prefix = "handmade" + desc = "A rather rough handmade backpack." + icon = 'icons/obj/items/storage/backpack/backpack_crafted.dmi' diff --git a/code/game/objects/items/weapons/storage/basket.dm b/code/game/objects/items/weapons/storage/basket.dm index d7eada187651..8c7661451a91 100644 --- a/code/game/objects/items/weapons/storage/basket.dm +++ b/code/game/objects/items/weapons/storage/basket.dm @@ -1,10 +1,25 @@ /obj/item/basket - name = "woven basket" - desc = "A simple woven basket. Very rustic." - icon = 'icons/obj/items/storage/basket.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_HUGE - slot_flags = SLOT_BACK + name_prefix = "woven" + name = "handbasket" + desc = "A simple woven basket. Very rustic." + icon = 'icons/obj/items/storage/baskets/basket_round.dmi' + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_HUGE material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - storage = /datum/storage/basket - material = /decl/material/solid/organic/plantmatter/grass/dry + storage = /datum/storage/basket + material = /decl/material/solid/organic/plantmatter/grass/dry + +/obj/item/basket/on_update_icon() + . = ..() + icon_state = get_world_inventory_state() + if(storage?.opened) + icon_state = "[icon_state]-open" + +/obj/item/basket/large + name_prefix = "large woven" + name = "basket" + slot_flags = SLOT_BACK + icon = 'icons/obj/items/storage/baskets/basket_large.dmi' + w_class = ITEM_SIZE_GARGANTUAN + storage = /datum/storage/basket/large + slowdown_general = 1 // Large and unwieldly diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3d6aa29ea001..3a5cde951c74 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -13,10 +13,6 @@ material = /decl/material/solid/organic/leather/synth var/overlay_flags -/obj/item/belt/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_belt_str) - /obj/item/belt/verb/toggle_layer() set name = "Switch Belt Layer" set category = "Object" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 847e581f4460..68f46f69269a 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -147,12 +147,12 @@ var/global/list/global/tank_gauge_cache = list() var/obj/item/assembly_holder/assy = proxyassembly.assembly if(assy.a_left && assy.a_right) - assy.dropInto(usr.loc) + assy.dropInto(user.loc) assy.master = null proxyassembly.assembly = null else if(!proxyassembly.assembly.a_left) - assy.a_right.dropInto(usr.loc) + assy.a_right.dropInto(user.loc) assy.a_right.holder = null assy.a_right = null proxyassembly.assembly = null @@ -299,7 +299,7 @@ var/global/list/global/tank_gauge_cache = list() return TOPIC_REFRESH if (href_list["stat"]) - toggle_valve(usr) + toggle_valve(user) return TOPIC_REFRESH /obj/item/tank/proc/toggle_valve(var/mob/user) @@ -553,7 +553,7 @@ var/global/list/global/tank_gauge_cache = list() return ..() /obj/item/tankassemblyproxy/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - tank.ignite() //boom (or not boom if you made shijwtty mix) + tank.cause_explosion() //boom (or not boom if you made shijwtty mix) /obj/item/tank/proc/assemble_bomb(W,user) //Bomb assembly proc. This turns assembly+tank into a bomb var/obj/item/assembly_holder/S = W @@ -573,7 +573,7 @@ var/global/list/global/tank_gauge_cache = list() update_icon(TRUE) -/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode +/obj/item/tank/proc/cause_explosion() //This happens when a bomb is told to explode var/obj/item/assembly_holder/assy = proxyassembly.assembly var/ign = assy.a_right var/obj/item/other = assy.a_left diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 4a95497c9aab..3b9c293256e1 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -192,7 +192,7 @@ var/turf/location = get_turf(user) if(isliving(O)) var/mob/living/L = O - L.IgniteMob() + L.ignite_fire() else if(isatom(O)) O.handle_external_heating(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, src, user) if (isturf(location)) @@ -243,7 +243,7 @@ var/mob/living/L = loc if(!(src in L.get_held_items())) fuel_usage = max(fuel_usage, 2) - L.IgniteMob() + L.ignite_fire() else if(isturf(loc)) var/turf/location = get_turf(src) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_IDLE, 5) //a bit colder when idling diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/weapons/tools/wirecutter.dm index 6cb93a254f17..2886de69bc3e 100644 --- a/code/game/objects/items/weapons/tools/wirecutter.dm +++ b/code/game/objects/items/weapons/tools/wirecutter.dm @@ -46,7 +46,7 @@ var/obj/item/handcuffs/cable/cuffs = target.get_equipped_item(slot_handcuffed_str) if(user.check_intent(I_FLAG_HELP) && istype(cuffs) && target.try_unequip(cuffs)) user.visible_message( - "\The [usr] cuts \the [target]'s restraints with \the [src]!", + "\The [user] cuts \the [target]'s restraints with \the [src]!", "You cut \the [target]'s restraints with \the [src]!", "You hear cable being cut." ) diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index e3f8e9e9d7a0..c117895cea1b 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -30,6 +30,7 @@ // Twohanded wrench. /obj/item/wrench/pipe + name_prefix = "enormous" name = "pipe wrench" desc = "You are no longer asking nicely." icon = 'icons/obj/items/tool/pipewrench.dmi' @@ -47,10 +48,6 @@ /obj/item/wrench/pipe/get_handle_color() return null -/obj/item/wrench/pipe/update_name() - . = ..() - SetName("enormous [name]") - /obj/item/wrench/pipe/Initialize() . = ..() set_extension(src, /datum/extension/tool, list(TOOL_WRENCH = TOOL_QUALITY_DEFAULT)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b9966cf27e9d..f1838fcfa065 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,7 +17,6 @@ var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/atom_damage_type = BRUTE var/armor_penetration = 0 var/anchor_fall = FALSE var/holographic = 0 //if the obj is a holographic object spawned by the holodeck diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index a4356724b358..b5206b950d30 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -164,7 +164,7 @@ /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/flour, - /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/dirt/visible, /obj/item/remains/robot ) return spawnable_choices @@ -210,8 +210,8 @@ /obj/item/stack/material/plank/mapped/wood/fifty, /obj/item/stack/material/cardstock/mapped/cardboard/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/ten, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/ten, + /obj/item/stack/material/rods/mapped/steel/fifty ) return spawnable_choices @@ -515,22 +515,22 @@ /obj/random/jewelry/spawn_choices() var/static/list/spawnable_choices = list( - /obj/item/clothing/ears/stud/wood = 10, - /obj/item/clothing/ears/dangle/wood = 10, - /obj/item/clothing/gloves/bracelet = 10, - /obj/item/clothing/neck/necklace = 10, - /obj/item/clothing/gloves/ring/material/silver = 5, - /obj/item/clothing/gloves/ring/material/bronze = 5, - /obj/item/clothing/gloves/ring/material/gold = 3, - /obj/item/clothing/ears/stud/silver = 3, - /obj/item/clothing/ears/dangle/silver = 3, - /obj/item/clothing/ears/stud/gold = 3, - /obj/item/clothing/ears/dangle/gold = 3, - /obj/item/clothing/gloves/ring/material/platinum = 1, - /obj/item/clothing/ears/stud/platinum = 1, - /obj/item/clothing/ears/dangle/platinum = 1, - /obj/item/clothing/ears/stud/diamond = 1, - /obj/item/clothing/ears/dangle/diamond = 1 + /obj/item/clothing/ears/stud/wood = 10, + /obj/item/clothing/ears/dangle/wood = 10, + /obj/item/clothing/gloves/bracelet = 10, + /obj/item/clothing/neck/necklace = 10, + /obj/item/clothing/gloves/ring/silver = 5, + /obj/item/clothing/gloves/ring/bronze = 5, + /obj/item/clothing/gloves/ring/gold = 3, + /obj/item/clothing/ears/stud/silver = 3, + /obj/item/clothing/ears/dangle/silver = 3, + /obj/item/clothing/ears/stud/gold = 3, + /obj/item/clothing/ears/dangle/gold = 3, + /obj/item/clothing/gloves/ring/platinum = 1, + /obj/item/clothing/ears/stud/platinum = 1, + /obj/item/clothing/ears/dangle/platinum = 1, + /obj/item/clothing/ears/stud/diamond = 1, + /obj/item/clothing/ears/dangle/diamond = 1 ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/multi.dm b/code/game/objects/random/subtypes/multi.dm index 34cd5d7077ef..a0268faecaeb 100644 --- a/code/game/objects/random/subtypes/multi.dm +++ b/code/game/objects/random/subtypes/multi.dm @@ -1,7 +1,3 @@ -/hook/roundstart/proc/roundstart_multi_spawn() - generate_multi_spawn_items() - return TRUE - /proc/generate_multi_spawn_items() for(var/id in multi_point_spawns) var/list/spawn_points = multi_point_spawns[id] diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index b1764d52754a..29c20b4b6d9a 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -322,3 +322,10 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen W.pixel_x = (CELLSIZE * (cell_x + 0.5)) - center["x"] W.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"] W.pixel_z = 0 + +/obj/structure/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) + . = ..() + if(. && (structure_flags & STRUCTURE_FLAG_THROWN_DAMAGE)) + visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) + playsound(src.loc, hitsound, 100, 1) + take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type) diff --git a/code/game/objects/structures/_structure_icon.dm b/code/game/objects/structures/_structure_icon.dm index 8dad14601ba2..3f3c7e7e4ec9 100644 --- a/code/game/objects/structures/_structure_icon.dm +++ b/code/game/objects/structures/_structure_icon.dm @@ -7,7 +7,7 @@ var/global/list/default_noblend_objects = list(/obj/machinery/door/window, /obj/ /obj/structure/on_update_icon() ..() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() cut_overlays() if(istype(lock)) update_lock_overlay() diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 2c50f024bbe1..3245a10faa26 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -17,7 +17,7 @@ if(material_alteration & MAT_FLAG_ALTERATION_DESC) update_material_desc() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() if((alpha / 255) < 0.5) set_opacity(FALSE) else @@ -49,7 +49,7 @@ else desc = base_desc -/obj/structure/proc/update_material_colour() +/obj/structure/proc/update_material_color() color = get_color() if(istype(material)) alpha = clamp((50 + material.opacity * 255), 0, 255) diff --git a/code/game/objects/structures/armor_stand.dm b/code/game/objects/structures/armor_stand.dm new file mode 100644 index 000000000000..7dabc4c24f02 --- /dev/null +++ b/code/game/objects/structures/armor_stand.dm @@ -0,0 +1,76 @@ +/obj/structure/armor_stand + name = "armor stand" + desc = "A simple stand used to hold armor and helmets for display." + icon = 'icons/obj/structures/armor_stand.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/list/slots_to_gear = list( + (slot_wear_suit_str) = null, + (slot_head_str) = null, + (slot_belt_str) = null, + (slot_shoes_str) = null, + (slot_gloves_str) = null + ) + var/list/gear_to_slot + +/obj/structure/armor_stand/Exited(atom/movable/AM, atom/new_loc) + . = ..() + var/weakref/atom_ref = weakref(AM) + if(atom_ref in gear_to_slot) + var/slot = gear_to_slot[atom_ref] + slots_to_gear[slot] = null + LAZYREMOVE(gear_to_slot, atom_ref) + update_icon() + +/obj/structure/armor_stand/Destroy() + slots_to_gear.Cut() + LAZYCLEARLIST(gear_to_slot) + . = ..() + +/obj/structure/armor_stand/attack_hand(mob/user) + . = ..() + if(. || !LAZYLEN(gear_to_slot)) + return + var/weakref/removed_item_ref + if(LAZYLEN(gear_to_slot) == 1) + removed_item_ref = gear_to_slot[1] + else + removed_item_ref = input(user, "Which piece of equipment would you like to remove?", "Armor Stand") as null|anything in gear_to_slot + if(!CanPhysicallyInteract(user) || QDELETED(src) || QDELETED(user) || !(removed_item_ref in gear_to_slot)) + return TRUE + var/obj/item/removed_item = removed_item_ref?.resolve() + if(istype(removed_item) && !QDELETED(removed_item) && removed_item.loc == src) + removed_item.dropInto(loc) + user.put_in_hands(removed_item) + return TRUE + +/obj/structure/armor_stand/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/clothing)) + var/obj/item/clothing/clothes = used_item + if(!(clothes.fallback_slot in slots_to_gear)) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [used_item].")) + else if(slots_to_gear[clothes.fallback_slot]) + var/weakref/atom_ref = slots_to_gear[clothes.fallback_slot] + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [atom_ref.resolve()].")) + else if(user.try_unequip(clothes, src)) + var/weakref/atom_ref = weakref(clothes) + slots_to_gear[clothes.fallback_slot] = atom_ref + LAZYSET(gear_to_slot, atom_ref, clothes.fallback_slot) + to_chat(user, SPAN_NOTICE("You hang \the [clothes] from \the [src].")) + update_icon() + return TRUE + return ..() + +/obj/structure/armor_stand/on_update_icon() + . = ..() + for(var/slot in slots_to_gear) + var/weakref/atom_ref = slots_to_gear[slot] + var/obj/item/thing = atom_ref?.resolve() + if(istype(thing)) + var/image/mob_overlay = thing.get_mob_overlay(null, slot) + mob_overlay.appearance_flags |= RESET_COLOR + add_overlay(mob_overlay) + compile_overlays() diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index f39d2f3c4e63..06d58e357aab 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -213,7 +213,7 @@ var/global/list/station_bookcases = list() /obj/structure/bookcase/cart/on_update_icon() // We don't (can't) call parent, so we have to do this here if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() cut_overlays() if(istype(lock)) update_lock_overlay() diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 769c6b5c7e35..9e717d53f973 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -42,7 +42,7 @@ var/global/list/closets = list() var/decl/closet_appearance/app = GET_DECL(closet_appearance) if(app) icon = app.icon - color = null + reset_color() queue_icon_update() return INITIALIZE_HINT_LATELOAD @@ -344,7 +344,7 @@ var/global/list/closets = list() if(!. && istype(AM) && opened && !istype(AM, /obj/structure/closet) && AM.simulated && !AM.anchored && (large || !ismob(AM))) step_towards(AM, loc) if(user != AM) - user.show_viewers(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!")) + user.visible_message(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!"), SPAN_DANGER("You stuff \the [AM] into \the [src]!")) return TRUE /obj/structure/closet/attack_ai(mob/living/silicon/ai/user) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 798d8f65c49f..6d3bec631ee9 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -128,7 +128,7 @@ /obj/item/stack/material/puck/mapped/uranium/fifty, /obj/item/stack/material/gemstone/mapped/diamond/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/fifty ) for(var/i = 0, i < 2, i++) diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index 4b03414f3bd8..61b227552247 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -82,7 +82,7 @@ if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() if(locked) - to_chat(usr, SPAN_WARNING("It's currently locked.")) + to_chat(user, SPAN_WARNING("It's currently locked.")) return TRUE if(open) close() diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index bffd87cc4fe2..4e1bafbf36eb 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -60,7 +60,7 @@ if(curtain_kind_path) var/decl/curtain_kind/kind = GET_DECL(curtain_kind_path) alpha = kind.alpha - color = kind.color + set_color(kind.color) // // Curtain Structure diff --git a/code/game/objects/structures/divider.dm b/code/game/objects/structures/divider.dm new file mode 100644 index 000000000000..d0cb78e85dfd --- /dev/null +++ b/code/game/objects/structures/divider.dm @@ -0,0 +1,48 @@ +/obj/structure/divider + name = "room divider" + desc = "A thin, somewhat flimsy folding room divider." + icon = 'icons/obj/structures/divider.dmi' + icon_state = ICON_STATE_WORLD + "-closed" + material = /decl/material/solid/organic/wood/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/extended = FALSE + +/obj/structure/divider/extended + icon_state = ICON_STATE_WORLD + extended = TRUE + +/obj/structure/divider/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/extended/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/attack_hand(mob/user) + if(user.check_intent(I_FLAG_HELP) && user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, silent = TRUE)) + extended = !extended + if(material.dooropen_noise) + playsound(loc, material.dooropen_noise, 50, 1) + update_divider() + visible_message(SPAN_NOTICE("\The [user] [extended ? "extends" : "collapses"] \the [src].")) + return TRUE + . = ..() + +/obj/structure/divider/Initialize() + . = ..() + update_divider() + +/obj/structure/divider/proc/update_divider() + anchored = extended + density = extended + opacity = extended || (material.opacity < 0.5) + update_icon() + +/obj/structure/divider/on_update_icon() + . = ..() + if(extended) + icon_state = ICON_STATE_WORLD + else + icon_state = ICON_STATE_WORLD + "-closed" diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 9079662e2438..745ad4bea2d6 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -1,18 +1,18 @@ /obj/structure/door - name = "door" - icon = 'icons/obj/doors/material_doors.dmi' - icon_state = "metal" - hitsound = 'sound/weapons/genhit.ogg' - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR - max_health = 50 - density = TRUE - anchored = TRUE - opacity = TRUE - - var/has_window = FALSE - var/changing_state = FALSE - var/icon_base + name = "door" + icon = 'icons/obj/doors/material_doors.dmi' + icon_state = "metal" + hitsound = 'sound/weapons/genhit.ogg' + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + anchored = TRUE + opacity = TRUE + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/has_window = FALSE + var/changing_state = FALSE var/door_sound_volume = 25 + var/icon_base /obj/structure/door/Initialize() ..() diff --git a/code/game/objects/structures/fishtanks.dm b/code/game/objects/structures/fishtanks.dm index 3dafa9160f31..b6724f467752 100644 --- a/code/game/objects/structures/fishtanks.dm +++ b/code/game/objects/structures/fishtanks.dm @@ -191,13 +191,13 @@ var/global/list/global/aquarium_states_and_layers = list( return if(!Adjacent(target)) return - usr.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) + user.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) if(!do_after(user,50)) return if (!Adjacent(target)) return - usr.forceMove(target) - usr.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) + user.forceMove(target) + user.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) /obj/structure/glass_tank/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) . = locate(/obj/structure/glass_tank) in (target == loc) ? (mover && mover.loc) : target diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index 7f8cb8294bed..615e9229cb48 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -70,7 +70,7 @@ /obj/structure/flora/plant/on_update_icon() . = ..() icon_state = "blank" - color = null + reset_color() set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = !!harvestable)) /obj/structure/flora/plant/attackby(obj/item/O, mob/user) diff --git a/code/game/objects/structures/flora/potted.dm b/code/game/objects/structures/flora/potted.dm index 5984436d57e7..b046efc7a545 100644 --- a/code/game/objects/structures/flora/potted.dm +++ b/code/game/objects/structures/flora/potted.dm @@ -9,7 +9,7 @@ anchored = FALSE layer = ABOVE_HUMAN_LAYER w_class = ITEM_SIZE_LARGE - remains_type = /obj/effect/decal/cleanable/dirt + remains_type = /obj/effect/decal/cleanable/dirt/visible hitsound = 'sound/effects/glass_crack2.ogg' snd_cut = 'sound/effects/break_ceramic.ogg' material = /decl/material/solid/stone/pottery diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d4aed89ecdcc..c508eb305f99 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -10,7 +10,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/cover = 50 var/prepped_for_fakewall @@ -30,9 +30,9 @@ if(reinf_material) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] rods from \the [src].")) if(do_after(user, 5 SECONDS, src) || QDELETED(src) || !reinf_material) - visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] rods from \the [src].")) reinf_material.place_dismantled_product(get_turf(src)) reinf_material = null return TRUE @@ -85,7 +85,7 @@ /obj/structure/girder/can_unanchor(var/mob/user) if(anchored && reinf_material) - to_chat(user, SPAN_WARNING("You must remove the support struts before you can dislodge \the [src].")) + to_chat(user, SPAN_WARNING("You must remove the support rods before you can dislodge \the [src].")) return FALSE . = ..() @@ -145,7 +145,7 @@ to_chat(user, SPAN_WARNING("You will need a support made of sturdier material to hold up [S.material.solid_name] cladding.")) return FALSE - add_hiddenprint(usr) + add_hiddenprint(user) if(S.material.integrity < 50) to_chat(user, SPAN_WARNING("This material is too soft for use in wall construction.")) return 0 @@ -165,7 +165,7 @@ var/turf/wall/T = get_turf(src) T.set_turf_materials(S.material, reinf_material, null, material) T.can_open = prepped_for_fakewall - T.add_hiddenprint(usr) + T.add_hiddenprint(user) material = null reinf_material = null qdel(src) @@ -182,7 +182,7 @@ if(!istype(M) || M.integrity < 50) to_chat(user, SPAN_WARNING("You cannot reinforce \the [src] with [M.solid_name]; it is too soft.")) return TRUE - visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] struts into \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] rods into \the [src].")) if (!do_after(user, 4 SECONDS, src) || !S.use(2)) return TRUE visible_message(SPAN_NOTICE("\The [user] finishes reinforcing \the [src] with [M.solid_name].")) diff --git a/code/game/objects/structures/grandfather_clock.dm b/code/game/objects/structures/grandfather_clock.dm new file mode 100644 index 000000000000..76cc0c8295d7 --- /dev/null +++ b/code/game/objects/structures/grandfather_clock.dm @@ -0,0 +1,64 @@ +// TODO: buildable with artifice? +// TODO: looping 2 second tick tock sound, somehow aligned with pendulum (may not be possible in DM) +/obj/structure/grandfather_clock + name = "grandfather clock" + desc = "A tall, stately timepiece." + icon = 'icons/obj/structures/grandfather_clock.dmi' + icon_state = ICON_STATE_WORLD + density = TRUE + material = /decl/material/solid/organic/wood/mahogany + material_alteration = MAT_FLAG_ALTERATION_ALL + var/face_color = "#f0edc7" + var/last_time + var/decl/material/clockwork_mat = /decl/material/solid/metal/brass + +/obj/structure/grandfather_clock/Initialize(ml, _mat, _reinf_mat) + if(ispath(clockwork_mat)) + clockwork_mat = GET_DECL(clockwork_mat) + . = ..() + START_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/grandfather_clock/examine(mob/user, distance, infix, suffix) + . = ..() + // TODO: check literacy? + if(isnull(last_time)) + last_time = stationtime2text() + to_chat(user, SPAN_NOTICE("The face of \the [src] reads [last_time].")) + +// TODO: don't magically make the time update when swinging is restarted +// TODO: alt interaction to interfere with the clock? +/obj/structure/grandfather_clock/attack_hand(mob/user) + . = ..() + if(!.) + if(is_processing) + STOP_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and stops the pendulum.")) + else + START_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and sets the pendulum swinging.")) + update_icon() + return TRUE + +/obj/structure/grandfather_clock/Process() + ..() + var/new_time = stationtime2text() + if(new_time != last_time) + last_time = new_time + update_icon() + +/obj/structure/grandfather_clock/on_update_icon() + . = ..() + if(isnull(last_time)) + last_time = stationtime2text() + if(face_color) + add_overlay(overlay_image(icon, "[icon_state]-face", face_color, RESET_COLOR)) + if(!clockwork_mat) + return + if(is_processing) + add_overlay(overlay_image(icon, "[icon_state]-pendulum-swing", clockwork_mat.color, RESET_COLOR)) + else + add_overlay(overlay_image(icon, "[icon_state]-pendulum", clockwork_mat.color, RESET_COLOR)) + var/list/time_stats = splittext(last_time, ":") + add_overlay(overlay_image(icon, "[icon_state]-hour[round(((text2num(time_stats[1]) / 24) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) + add_overlay(overlay_image(icon, "[icon_state]-minute[round(((text2num(time_stats[2]) / 60) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) diff --git a/code/game/objects/structures/hay.dm b/code/game/objects/structures/hay.dm new file mode 100644 index 000000000000..47fa6ac32056 --- /dev/null +++ b/code/game/objects/structures/hay.dm @@ -0,0 +1,73 @@ +// Items that provide animal feed. +/datum/storage/haystack + can_hold = list(/obj/item/food/hay) + +// Not actually a food item, but you can eat it if you like. +/obj/item/food/hay + name = "handful of hay" + icon = 'icons/obj/food/hay.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/plantmatter/grass/dry + nutriment_amt = 1 + nutriment_type = /decl/material/solid/organic/plantmatter/grass + material_alteration = MAT_FLAG_ALTERATION_COLOR + +/obj/item/food/hay/end_throw() + . = ..() + addtimer(CALLBACK(src, PROC_REF(check_self_destroy)), 1, (TIMER_UNIQUE | TIMER_OVERRIDE) ) + +/obj/item/food/hay/proc/check_self_destroy() + if(isturf(loc) && !QDELETED(src)) + physically_destroyed() + +/obj/item/food/hay/physically_destroyed() + new /obj/effect/decal/cleanable/hay(loc) + . = ..() + +/obj/effect/decal/cleanable/hay + name = "loose hay" + desc = "Some loose hay from a haybale." + icon = 'icons/effects/hay.dmi' + icon_state = ICON_STATE_WORLD + color = /decl/material/solid/organic/plantmatter/grass/dry::color + sweepable = TRUE + +/obj/effect/decal/cleanable/hay/Initialize(ml, _age) + for(var/obj/effect/decal/cleanable/hay/hay in loc) + if(hay != src) + return INITIALIZE_HINT_QDEL + return ..() + +/obj/structure/haystack + name = "haystack" + desc = "A pile of dry, prickly hay. Not a great place for storing needles." + icon = 'icons/obj/structures/haystack.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/plantmatter/grass/dry + storage = /datum/storage/haystack + material_alteration = MAT_FLAG_ALTERATION_COLOR + atom_flags = ATOM_FLAG_CLIMBABLE + var/const/FOOD_MAX = 20 + +/obj/structure/haystack/Initialize(ml, _mat, _reinf_mat) + . = ..() + for(var/i = 1 to FOOD_MAX) + new /obj/item/food/hay(src) + storage.make_exact_fit() + +/obj/structure/haystack/Exited(atom/movable/am, atom/new_loc) + . = ..() + if(!QDELETED(src) && !length(contents)) + physically_destroyed() + +/obj/structure/haystack/create_matter() + matter = null // Haystack is almost a dummy item; the matter is the food inside. + +/obj/structure/haystack/physically_destroyed(skip_qdel) + new /obj/effect/decal/cleanable/hay(loc) + . = ..() + +/obj/structure/haystack/bale + name = "haybale" + desc = "A tight bundle of dry grass, probably set aside as animal feed." + icon = 'icons/obj/structures/haybale.dmi' diff --git a/code/game/objects/structures/pillar.dm b/code/game/objects/structures/pillar.dm index 6f625ac789b5..6c77b5c53792 100644 --- a/code/game/objects/structures/pillar.dm +++ b/code/game/objects/structures/pillar.dm @@ -17,3 +17,14 @@ /obj/structure/pillar/triad icon = 'icons/obj/structures/pillars/pillar_triad.dmi' + +/obj/structure/pillar/wide + name = "wide pillar" + w_class = ITEM_SIZE_LARGE_STRUCTURE + icon = 'icons/obj/structures/pillars/pillar_wide_round.dmi' + +/obj/structure/pillar/wide/square + icon = 'icons/obj/structures/pillars/pillar_wide_square.dmi' + +/obj/structure/pillar/wide/inset + icon = 'icons/obj/structures/pillars/pillar_wide_inset.dmi' diff --git a/code/game/objects/structures/racks.dm b/code/game/objects/structures/racks.dm index 7f1c77404ec0..3ade37d94fe8 100644 --- a/code/game/objects/structures/racks.dm +++ b/code/game/objects/structures/racks.dm @@ -10,7 +10,7 @@ atom_flags = ATOM_FLAG_CLIMBABLE throwpass = TRUE parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods density = TRUE anchored = TRUE structure_flags = STRUCTURE_FLAG_SURFACE diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 93926bd3e51c..66f0afe17852 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -14,7 +14,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/broken = FALSE var/neighbor_status = 0 diff --git a/code/game/objects/structures/rug.dm b/code/game/objects/structures/rug.dm new file mode 100644 index 000000000000..b4bf628184f6 --- /dev/null +++ b/code/game/objects/structures/rug.dm @@ -0,0 +1,12 @@ +/obj/structure/rug + name = "rug" + desc = "A small, circular floor covering." + icon = 'icons/obj/structures/rug.dmi' + material = /decl/material/solid/organic/cloth/wool + icon_state = ICON_STATE_WORLD + paint_color = COLOR_GRAY20 + color = COLOR_GRAY20 + +/obj/structure/rug/crafted + paint_color = null + color = null diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 7b78fc8c944e..10db1cd1afb3 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -100,7 +100,7 @@ FLOOR SAFES to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") return - var/canhear = locate(/obj/item/clothing/neck/stethoscope) in usr.get_held_items() + var/canhear = locate(/obj/item/clothing/neck/stethoscope) in user.get_held_items() if(href_list["decrement"]) dial = decrement(dial) if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm index 2090da1a2ccd..f1ec03d9f7cf 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/bed.dm @@ -22,7 +22,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods user_comfort = 1 obj_flags = OBJ_FLAG_SUPPORT_MOB var/base_icon = "bed" @@ -234,8 +234,8 @@ remove_beaker(user) return TRUE -/obj/structure/bed/roller/proc/collapse() - visible_message("[usr] collapses [src].") +/obj/structure/bed/roller/proc/collapse(mob/user) + visible_message("[user] collapses [src].") new item_form_type(get_turf(src)) qdel(src) @@ -300,7 +300,7 @@ remove_beaker(user) return TRUE if(!buckled_mob) - collapse() + collapse(user) return TRUE . = ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm index 2d3f23568f60..07eeb6e20876 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm @@ -157,14 +157,11 @@ return ..() /obj/item/stool/rustic - name = "stool" - icon = 'icons/obj/stool_rustic.dmi' - material = /decl/material/solid/organic/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - -/obj/item/stool/rustic/update_name() - ..() - SetName("rustic [name]") // rustic oaken stool, not oaken rustic stool + name_prefix = "rustic" + name = "stool" + icon = 'icons/obj/stool_rustic.dmi' + material = /decl/material/solid/organic/wood/walnut + color = /decl/material/solid/organic/wood/walnut::color /obj/item/stool/rustic/can_be_padded() return FALSE diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 42e490933430..999ab76ec864 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -19,7 +19,7 @@ tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods structure_flags = STRUCTURE_FLAG_SURFACE can_support_butchery = TRUE @@ -59,8 +59,11 @@ // We do this because need to make sure adjacent tables init their material before we try and merge. /obj/structure/table/LateInitialize() ..() - update_connections(TRUE) - update_icon() + if(is_flipped) + flip(dir, TRUE) + else + update_connections(TRUE) + update_icon() /obj/structure/table/get_material_health_modifier() . = additional_reinf_material ? 0.75 : 0.5 @@ -290,80 +293,74 @@ if(additional_reinf_material) desc = "[desc] It has been reinforced with [additional_reinf_material.solid_name]." -/obj/structure/table/on_update_icon() - - color = "#ffffff" +/obj/structure/table/proc/handle_normal_icon() + color = null // Don't double-apply our color, clear the map preview. alpha = 255 - ..() - - if(!handle_generic_blending) - return - icon_state = "blank" - if(!is_flipped) - mob_offset = initial(mob_offset) - var/image/I - // Base frame shape. + var/image/I + // Base frame shape. + for(var/i = 1 to 4) + I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") + I.color = material.color + I.alpha = 255 * material.opacity + add_overlay(I) + // Tabletop + if(reinf_material) for(var/i = 1 to 4) - I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") - I.color = material.color - I.alpha = 255 * material.opacity - add_overlay(I) - // Tabletop - if(reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = reinf_material.color - I.alpha = 255 * reinf_material.opacity - add_overlay(I) - if(additional_reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = additional_reinf_material.color - I.alpha = 255 * additional_reinf_material.opacity - add_overlay(I) - - if(felted) - for(var/i = 1 to 4) - add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) - else - - mob_offset = 0 - - var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) - var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) - var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir - var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir - - var/flip_type = 0 - var/flip_mod = "" - if(left_neighbor_blend && right_neighbor_blend) - flip_type = 2 - icon_state = "flip[flip_type]" - else if(left_neighbor_blend || right_neighbor_blend) - flip_type = 1 - flip_mod = (left_neighbor_blend ? "+" : "-") - icon_state = "flip[flip_type][flip_mod]" - - color = material.color - alpha = 255 * material.opacity - - var/image/I - if(reinf_material) - I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = reinf_material.color I.alpha = 255 * reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(additional_reinf_material) - I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + if(additional_reinf_material) + for(var/i = 1 to 4) + I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = additional_reinf_material.color I.alpha = 255 * additional_reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(felted) - add_overlay("carpet_flip[flip_type][flip_mod]") + if(felted) + for(var/i = 1 to 4) + add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) + +/obj/structure/table/proc/handle_flipped_icon() + var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) + var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) + var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir + var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir + + var/flip_type = 0 + var/flip_mod = "" + if(left_neighbor_blend && right_neighbor_blend) + flip_type = 2 + icon_state = "flip[flip_type]" + else if(left_neighbor_blend || right_neighbor_blend) + flip_type = 1 + flip_mod = (left_neighbor_blend ? "+" : "-") + icon_state = "flip[flip_type][flip_mod]" + + var/image/I + if(reinf_material) + I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I.color = reinf_material.color + I.alpha = 255 * reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + if(additional_reinf_material) + I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + I.color = additional_reinf_material.color + I.alpha = 255 * additional_reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + + if(felted) + add_overlay("carpet_flip[flip_type][flip_mod]") + +/obj/structure/table/on_update_icon() + . = ..() + if(is_flipped) + handle_flipped_icon() + else + handle_normal_icon() /obj/structure/table/proc/blend_with(var/obj/structure/table/other) if(!istype(other) || !istype(material) || !istype(other.material) || material.type != other.material.type) @@ -585,7 +582,8 @@ if(dir != NORTH) layer = ABOVE_HUMAN_LAYER atom_flags &= ~ATOM_FLAG_CLIMBABLE //flipping tables allows them to be used as makeshift barriers - is_flipped = 1 + is_flipped = TRUE + mob_offset = 0 atom_flags |= ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(direction, 90), turn(direction, -90))) @@ -617,6 +615,7 @@ reset_plane_and_layer() atom_flags |= ATOM_FLAG_CLIMBABLE is_flipped = FALSE + mob_offset = initial(mob_offset) atom_flags &= ~ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(dir, 90), turn(dir, -90))) var/obj/structure/table/T = locate() in get_step(src.loc,D) @@ -854,6 +853,9 @@ material_alteration = MAT_FLAG_ALTERATION_ALL can_flip = FALSE +/obj/structure/table/end/handle_normal_icon() + icon_state = initial(icon_state) + /obj/structure/table/end/alt icon_state = "end_table_2" @@ -900,6 +902,9 @@ // we don't do frames or anything, just skip right to decon tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT +/obj/structure/table/desk/handle_normal_icon() + return // logic is handled in on_update_icon + /obj/structure/table/desk/right icon_state = "desk_right" diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index d1e4d36df79d..0dc8afefce6a 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -1,49 +1,97 @@ -// Target stakes for the firing range. +// TODO: skill check on melee/ranged hit to show bullseye/heart shot/etc /obj/structure/target_stake - name = "target stake" - desc = "A thin platform with negatively-magnetized wheels." - icon = 'icons/obj/objects.dmi' - icon_state = "target_stake" - density = TRUE - obj_flags = OBJ_FLAG_CONDUCTIBLE - var/obj/item/target/pinned_target - -/obj/structure/target_stake/attackby(var/obj/item/W, var/mob/user) - if (!pinned_target && istype(W, /obj/item/target) && user.try_unequip(W, get_turf(src))) - to_chat(user, "You slide [W] into the stake.") - set_target(W) + name = "target stake" + desc = "A simple stand used to prop up a target for practice." + icon = 'icons/obj/structures/target_stakes/target_stake.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/obj/item/training_dummy/dummy + +/obj/structure/target_stake/Destroy() + dummy = null + . = ..() + +/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(dummy?.repair_target_dummy(used_item, user)) return TRUE return ..() -/obj/structure/target_stake/attack_hand(var/mob/user) - if (!pinned_target || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) - return ..() - to_chat(user, SPAN_NOTICE("You take \the [pinned_target] off the stake.")) - user.put_in_hands(pinned_target) - set_target(null) - return TRUE - -/obj/structure/target_stake/proc/set_target(var/obj/item/target/T) - if (T) - set_density(0) - T.set_density(1) - T.pixel_x = 0 - T.pixel_y = 0 - T.layer = ABOVE_OBJ_LAYER - events_repository.register(/decl/observ/moved, T, src, TYPE_PROC_REF(/atom/movable, move_to_turf)) - events_repository.register(/decl/observ/moved, src, T, TYPE_PROC_REF(/atom/movable, move_to_turf)) - T.stake = src - pinned_target = T - else - set_density(1) - if(pinned_target) - pinned_target.set_density(0) - pinned_target.layer = OBJ_LAYER - events_repository.unregister(/decl/observ/moved, pinned_target, src) - events_repository.unregister(/decl/observ/moved, src, pinned_target) - pinned_target.stake = null - pinned_target = null +/obj/structure/target_stake/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(dummy) + . = dummy.take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(QDELETED(dummy)) + dummy = null + update_icon() + return + return ..() -/obj/structure/target_stake/Destroy() +/obj/structure/target_stake/proc/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy) && !istype(new_dummy, /obj/item/training_dummy/straw/archery) + +/obj/structure/target_stake/attack_hand(mob/user) + if(dummy) + dummy.dropInto(loc) + user.put_in_hands(dummy) + dummy = null + update_icon() + return TRUE + return ..() + +/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/training_dummy) && can_hold_dummy(user, used_item)) + if(dummy) + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [dummy].")) + else if(user.try_unequip(used_item, src)) + dummy = used_item + visible_message(SPAN_NOTICE("\The [user] places \the [dummy] onto \the [src].")) + update_icon() + return TRUE + return ..() + +/obj/structure/target_stake/Initialize(ml, _mat, _reinf_mat) + if(ispath(dummy)) + dummy = new dummy(src) + . = ..() + update_icon() + +/obj/structure/target_stake/on_update_icon() . = ..() - set_target(null) \ No newline at end of file + if(dummy) + // WTB way to stop vis_contents inheriting atom color + var/image/dummy_overlay = new /image + dummy_overlay.appearance = dummy + dummy_overlay.pixel_x = 0 + dummy_overlay.pixel_y = 0 + dummy_overlay.pixel_z = 0 + dummy_overlay.pixel_w = 0 + dummy_overlay.plane = FLOAT_PLANE + dummy_overlay.layer = FLOAT_LAYER + dummy_overlay.appearance_flags |= RESET_COLOR + add_overlay(dummy_overlay) + +// Subtypes below. +/obj/structure/target_stake/steel + material = /decl/material/solid/metal/steel + +/obj/structure/target_stake/archery + name = "archery butt" + desc = "A heavy circular target used for practicing archery." + icon = 'icons/obj/structures/target_stakes/archery_butt.dmi' + +/obj/structure/target_stake/archery/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy, /obj/item/training_dummy/straw/archery) + +// Subtypes with/for dummies. +/obj/structure/target_stake/mapped + dummy = /obj/item/training_dummy/straw + +/obj/structure/target_stake/steel/mapped/Initialize() + dummy = pick(/obj/item/training_dummy, /obj/item/training_dummy/alien, /obj/item/training_dummy/syndicate) + return ..() + +/obj/structure/target_stake/archery/mapped + dummy = /obj/item/training_dummy/straw/archery diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 850fc4d7c580..3aaf589d466e 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -18,7 +18,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 40 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/stripe_color var/list/connections var/list/other_connections diff --git a/code/game/objects/structures/wall_sconce.dm b/code/game/objects/structures/wall_sconce.dm index 5a3dd0a38a2f..c1211712b3c8 100644 --- a/code/game/objects/structures/wall_sconce.dm +++ b/code/game/objects/structures/wall_sconce.dm @@ -58,6 +58,10 @@ QDEL_NULL(light_source) return ..() +/obj/structure/wall_sconce/ignite_fire() + . = ..() + update_icon() + /obj/structure/wall_sconce/physically_destroyed() if(light_source) light_source.dropInto(loc) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 3fc9cf8adc2e..9d3ce2f33cfd 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -347,3 +347,6 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_environment_proc(turf/floor/target) return PROCESS_KILL + +/decl/flooring/proc/handle_turf_digging(turf/floor/target) + return TRUE diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 802c509f5738..a9e70bbf7368 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -21,6 +21,10 @@ return TRUE return ..() +/decl/flooring/grass/handle_turf_digging(turf/floor/target) + target.set_flooring(null) + return FALSE + /decl/flooring/grass/wild name = "wild grass" icon = 'icons/turf/flooring/wildgrass.dmi' diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index eaed5e06b524..eb80eae759e6 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -76,8 +76,8 @@ /decl/flooring/straw name = "straw floor" desc = "A thick layer of straw, suitable for livestock." - icon = 'icons/turf/flooring/wildgrass.dmi' // temporary, replace with better icon at some point - icon_base = "wildgrass" + icon = 'icons/turf/flooring/straw.dmi' + icon_base = "straw" has_base_range = null icon_edge_layer = FLOOR_EDGE_GRASS_WILD damage_temperature = T0C+80 diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm index 4262e953ad82..3351970e8af6 100644 --- a/code/game/turfs/floors/floor_digging.dm +++ b/code/game/turfs/floors/floor_digging.dm @@ -1,3 +1,6 @@ +/turf/floor + var/gemstone_dropped = FALSE + /turf/floor/proc/is_fundament() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? !flooring.constructed : TRUE @@ -23,21 +26,31 @@ /turf/floor/can_dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP) -/turf/floor/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - if(!is_fundament()) +/turf/floor/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) + if(is_fundament()) + handle_trench_digging(user) + +/turf/floor/proc/handle_trench_digging(mob/user) + var/decl/flooring/flooring = get_topmost_flooring() + if(!flooring.handle_turf_digging(src)) return - var/new_height = max(get_physical_height()-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) - var/height_diff = abs(get_physical_height()-new_height) // Only drop mats if we actually changed the turf height sufficiently. + var/old_height = get_physical_height() + var/new_height = max(old_height-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) + var/height_diff = abs(old_height-new_height) if(height_diff >= TRENCH_DEPTH_PER_ACTION) - drop_diggable_resources() + drop_diggable_resources(user) set_physical_height(new_height) -/turf/floor/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/floor/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return has_flooring() ? null : ..() /turf/floor/get_diggable_resources() var/decl/material/my_material = get_material() if(is_fundament() && istype(my_material) && my_material.dug_drop_type && (get_physical_height() > -(FLUID_DEEP))) - return list(my_material.dug_drop_type = list(3, 2)) - return null + . = list() + .[my_material.dug_drop_type] = list("amount" = 3, "variance" = 2, "material" = my_material.type) + if(!gemstone_dropped && prob(my_material.gemstone_chance) && LAZYLEN(my_material.gemstone_types)) + gemstone_dropped = TRUE + var/gem_mat = pick(my_material.gemstone_types) + .[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat) diff --git a/code/game/turfs/floors/subtypes/floor_misc.dm b/code/game/turfs/floors/subtypes/floor_misc.dm index fbc7d2400e17..a88eb9784ea3 100644 --- a/code/game/turfs/floors/subtypes/floor_misc.dm +++ b/code/game/turfs/floors/subtypes/floor_misc.dm @@ -45,8 +45,8 @@ /turf/floor/straw name = "loose straw" - icon = 'icons/turf/flooring/wildgrass.dmi' - icon_state = "wildgrass" + icon = 'icons/turf/flooring/straw.dmi' + icon_state = "straw" color = COLOR_WHEAT _flooring = /decl/flooring/straw diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a034ac913ee2..18bd63adae10 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -637,6 +637,7 @@ LAZYDISTINCTADD(., air_graphic) if(length(weather?.vis_contents_additions)) LAZYADD(., weather.vis_contents_additions) + . += pick(weather.particle_sources) // we know . is never null here if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) diff --git a/code/game/turfs/turf_digging.dm b/code/game/turfs/turf_digging.dm index 6eea34afe2e0..5f832ae8045c 100644 --- a/code/game/turfs/turf_digging.dm +++ b/code/game/turfs/turf_digging.dm @@ -1,5 +1,5 @@ -/// Return an assoc list of resource item type to a base and a random component -/// ex. return list(/obj/item/stack/material/ore/handful/sand = list(3, 2)) +/// Return an assoc list of resource item type to a metadata list containing base amount, random component, and material override +/// ex. return list(/obj/item/stack/material/ore/handful/sand = list("amount" = 3, "variance" = 2, "material" = /decl/material/foo)) /turf/proc/get_diggable_resources() return null @@ -10,17 +10,31 @@ /turf/proc/can_be_dug(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE -/turf/proc/drop_diggable_resources() +/turf/proc/drop_diggable_resources(mob/user) SHOULD_CALL_PARENT(TRUE) var/list/diggable_resources = get_diggable_resources() if(!length(diggable_resources)) return for(var/resource_type in diggable_resources) - var/list/resource_amounts = diggable_resources[resource_type] + + var/list/resource_data = diggable_resources[resource_type] + var/list/loot = list() + var/amount = max(1, resource_data["amount"] + resource_data["variance"]) + var/spawn_material = resource_data["material"] + if(ispath(resource_type, /obj/item/stack)) - LAZYADD(., new resource_type(src, resource_amounts[1] + rand(resource_amounts[2]), get_material_type())) + loot += new resource_type(src, amount, spawn_material) else - LAZYADD(., new resource_type(src, get_material_type())) + for(var/i = 1 to amount) + loot += new resource_type(src, spawn_material) + + if(length(loot)) + if(user) + for(var/obj/item/thing in loot) + if(thing.material && thing.material != get_material()) + to_chat(user, SPAN_NOTICE("You unearth \a [thing]!")) + LAZYADD(., loot) + clear_diggable_resources() // Procs for digging pits. @@ -29,10 +43,10 @@ /turf/proc/try_dig_pit(var/mob/user, var/obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_pit(tool?.material?.hardness, using_tool) + return dig_pit(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_pit(tool_hardness, using_tool) && new /obj/structure/pit(src) // Procs for digging farms. @@ -44,10 +58,10 @@ if(!material?.tillable) return if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, set_cooldown = TRUE, check_skill = SKILL_BOTANY)) - return dig_farm(tool?.material?.hardness, using_tool) + return dig_farm(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_farm(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_farm(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_farm(tool_hardness, using_tool) && new /obj/machinery/portable_atmospherics/hydroponics/soil(src) // Proc for digging trenches. @@ -56,8 +70,8 @@ /turf/proc/try_dig_trench(mob/user, obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 2.5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_trench(tool?.material?.hardness, using_tool) + return dig_trench(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE diff --git a/code/game/turfs/turf_effects.dm b/code/game/turfs/turf_effects.dm index 84aaba661be4..93e5da6a91ee 100644 --- a/code/game/turfs/turf_effects.dm +++ b/code/game/turfs/turf_effects.dm @@ -37,6 +37,7 @@ if(!dirt) dirt = new(src) dirt.dirt_amount = min(dirt.dirt_amount + amount, MAX_DIRT) + dirt.update_icon() return TRUE #undef MAX_DIRT diff --git a/code/game/turfs/turf_navigation.dm b/code/game/turfs/turf_navigation.dm new file mode 100644 index 000000000000..9085f6b99d9a --- /dev/null +++ b/code/game/turfs/turf_navigation.dm @@ -0,0 +1,62 @@ +/******************************************************************/ +// Navigation procs +// Used for A-star pathfinding + +// Returns the surrounding cardinal turfs with open links +// Including through doors openable with the ID +/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) + var/L[] = new() + + for(var/d in global.cardinal) + var/turf/T = get_step(src, d) + if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) + L.Add(T) + return L + + +// Returns true if a link between A and B is blocked +// Movement through doors allowed if ID has access +/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) + + if(A == null || B == null) return 1 + var/adir = get_dir(A,B) + var/rdir = get_dir(B,A) + if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal + var/iStep = get_step(A,adir&(NORTH|SOUTH)) + if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) + return 0 + + var/pStep = get_step(A,adir&(EAST|WEST)) + if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) + return 0 + return 1 + + if(DirBlockedWithAccess(A,adir, ID)) + return 1 + + if(DirBlockedWithAccess(B,rdir, ID)) + return 1 + + for(var/obj/O in B) + if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + return 1 + + return 0 + +// Returns true if direction is blocked from loc +// Checks doors against access with given ID +/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) + for(var/obj/structure/window/D in loc) + if(!D.density) continue + if(D.dir == SOUTHWEST) return 1 + if(D.dir == dir) return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density) continue + if(istype(D, /obj/machinery/door/window)) + if( dir & D.dir ) return !D.check_access(ID) + + //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) + //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) + else return !D.check_access(ID) // it's a real, air blocking door + return 0 diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 084fb135e175..973d7105635d 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -18,7 +18,7 @@ var/global/list/wall_fullblend_objects = list( /turf/wall name = "wall" - desc = "A huge chunk of metal used to seperate rooms." + desc = "A huge chunk of metal used to separate rooms." icon = 'icons/turf/walls/_previews.dmi' icon_state = "solid" opacity = TRUE @@ -51,6 +51,8 @@ var/global/list/wall_fullblend_objects = list( var/handle_structure_blending = TRUE var/min_dismantle_amount = 2 var/max_dismantle_amount = 2 + /// The reinforcement icon to use. Set in update_material() based on reinf_material. + var/reinf_icon /// Icon to use if shutter state is non-null. var/shutter_icon = 'icons/turf/walls/shutter.dmi' diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index c682d4f266fe..08732bbecaf9 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -12,8 +12,12 @@ if(material) explosion_resistance = material.explosion_resistance hitsound = material.hitsound - if(reinf_material && reinf_material.explosion_resistance > explosion_resistance) - explosion_resistance = reinf_material.explosion_resistance + if(reinf_material) + reinf_icon = islist(reinf_material.icon_reinf) ? pick(reinf_material.icon_reinf) : reinf_material.icon_reinf + if(reinf_material.explosion_resistance > explosion_resistance) + explosion_resistance = reinf_material.explosion_resistance + else + reinf_icon = null update_strings() refresh_opacity() SSradiation.resistance_cache.Remove(src) @@ -52,7 +56,16 @@ . = (istype(material) && material.icon_base) || 'icons/turf/walls/solid.dmi' /turf/wall/proc/apply_reinf_overlay() - . = istype(reinf_material) + . = istype(reinf_material) && reinf_icon + +/// Gets the base wall colour for icon rendering. Can be overridden on wall subtypes. Not equivalent to get_color(). +/// Should only be used in places where material is known to be set, e.g. update_wall_icon(). +/turf/wall/proc/get_base_color() + return material.color + +/// Gets the reinforcement colour. Can be overridden so that some wall types don't apply paint colour to their reinforcements. +/turf/wall/proc/get_reinf_color() + return paint_color || reinf_material?.color /turf/wall/proc/refresh_connections() if(wall_connections && other_connections) @@ -100,7 +113,7 @@ /turf/wall/proc/update_wall_icon() var/material_icon_base = get_wall_icon() - var/base_color = material.color + var/base_color = get_base_color() var/new_icon var/new_icon_state @@ -124,17 +137,17 @@ if(apply_reinf_overlay()) var/image/I - var/reinf_color = paint_color ? paint_color : reinf_material.color + var/reinf_color = get_reinf_color() if(construction_stage != null && construction_stage < 6) I = image('icons/turf/walls/_construction_overlays.dmi', "[construction_stage]") I.color = reinf_color add_overlay(I) else if(reinf_material.use_reinf_state) - I = image(reinf_material.icon_reinf, reinf_material.use_reinf_state) + I = image(reinf_icon, reinf_material.use_reinf_state) I.color = reinf_color else - I = image(_get_wall_subicon(reinf_material.icon_reinf, wall_connections, reinf_color)) + I = image(_get_wall_subicon(reinf_icon, wall_connections, reinf_color)) add_overlay(I) // Update icon on ambient light change, for shutter overlays. diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index e878e59747e5..96967f55e2ef 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -10,6 +10,7 @@ var/image/ore_overlay var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE + var/gem_dropped = FALSE /turf/wall/natural/flooded flooded = /decl/material/liquid/water @@ -150,6 +151,10 @@ if(prob(30) && !ramp_slope_direction && material) var/drop_type = material.ore_type || /obj/item/stack/material/ore pass_geodata_to(new drop_type(src, material.ore_result_amount, material.type)) + if(!gem_dropped && material && prob(material.gemstone_chance) && LAZYLEN(material.gemstone_types)) + gem_dropped = TRUE + new /obj/item/gemstone(get_turf(src), pickweight(material.gemstone_types)) + visible_message(SPAN_NOTICE("A glimmer of colour shines amongst the rubble...")) /turf/wall/natural/proc/pass_geodata_to(obj/O) var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) diff --git a/code/game/turfs/walls/wall_wattle.dm b/code/game/turfs/walls/wall_wattle.dm new file mode 100644 index 000000000000..42a93e90fc08 --- /dev/null +++ b/code/game/turfs/walls/wall_wattle.dm @@ -0,0 +1,158 @@ +/turf/wall/wattle + icon_state = "wattle" + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + girder_material = null + floor_type = /turf/floor/dirt + min_dismantle_amount = 3 + max_dismantle_amount = 5 + shutter_icon = 'icons/turf/walls/square_shutter.dmi' + var/decl/skill/daubing_skill = SKILL_CONSTRUCTION + var/decl/material/daubing_material // todo: daubing as a material made from clay/soil and plant matter? + var/const/matter_to_daub = MATTER_AMOUNT_REINFORCEMENT + // Currently, plastering is done via painting... undecided if that should change in the future. + +/turf/wall/wattle/Initialize(ml, materialtype, rmaterialtype) + if(ispath(daubing_material)) + daubing_material = GET_DECL(daubing_material) + return ..() + +/turf/wall/wattle/get_turf_validation_corner_states() + return list("", "paint") // paint should always be available because of plastering! + +// Daubing with clay or soil +/turf/wall/wattle/attackby(obj/item/W, mob/user, click_params) + if(isnull(daubing_material)) + var/static/list/daub_materials = list( // Does not include subtypes. + /decl/material/solid/soil = TRUE, + /decl/material/solid/clay = TRUE + ) + if(istype(W, /obj/item/stack/material) && daub_materials[W.material?.type]) + if(!user.check_dexterity(DEXTERITY_WIELD_ITEM)) + return TRUE + var/obj/item/stack/material/stack = W + var/sheets_to_use = stack.matter_units_to_sheets(matter_to_daub) + if(stack.can_use(sheets_to_use) && user.do_skilled(1 SECOND, daubing_skill, target = src) && stack.can_use(sheets_to_use)) + to_chat(user, SPAN_NOTICE("You daub \the [src] with \the [stack].")) + daubing_material = stack.material + stack.use(sheets_to_use) + else if(stack.can_use(sheets_to_use)) // failed the do_skilled + to_chat(user, SPAN_WARNING("You have to stay still to daub \the [src] with \the [stack].")) + else + to_chat(user, SPAN_WARNING("You need [stack.get_string_for_amount(sheets_to_use)] to daub \the [src].")) + return TRUE + return ..() + +/turf/wall/wattle/get_dismantle_stack_type() + return /obj/item/stack/material/log // temp? + +// daubed walls have the color of their daubing +/turf/wall/wattle/get_base_color() + if(daubing_material) + return "#ae9f70" // daubing_material.color // sorry, but using the daubing material color looks bad + return ..() + +// don't plaster over our damn reinforcements +/turf/wall/wattle/get_reinf_color() + return reinf_material?.color + +/turf/wall/wattle/get_wall_icon() + if(isnull(daubing_material)) + return 'icons/turf/walls/wattle.dmi' + else + return 'icons/turf/walls/wattledaub.dmi' + +/turf/wall/wattle/get_dismantle_sound() + return 'sound/foley/wooden_drop.ogg' + +/turf/wall/wattle/update_strings() + if(isnull(daubing_material)) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips." + else if(paint_color) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed plastered wall") + else + SetName("plastered wall") + else + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips." + +/turf/wall/wattle/daubed + icon_state = "wattledaub" + daubing_material = /decl/material/solid/clay + // the daub is lost when destroyed/deconstructed, since it's dried anyway + +/turf/wall/wattle/daubed/plastered + icon_state = "plaster" + paint_color = "#c2b8a1" // this is what applies the plaster... icky + color = "#c2b8a1" // preview color for plaster + +/turf/wall/wattle/daubed/plastered/framed + icon_state = "framed" + reinf_material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color // preview, still painted + +// Subtypes. +#define WATTLE_WALL_SUBTYPE(material_name) \ +/turf/wall/wattle/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + reinf_material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +} +WATTLE_WALL_SUBTYPE(fungal) +WATTLE_WALL_SUBTYPE(ebony) +WATTLE_WALL_SUBTYPE(walnut) +WATTLE_WALL_SUBTYPE(maple) +WATTLE_WALL_SUBTYPE(mahogany) +WATTLE_WALL_SUBTYPE(bamboo) +WATTLE_WALL_SUBTYPE(yew) + +#undef WATTLE_WALL_SUBTYPE \ No newline at end of file diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 4131ea677aef..dacae0436607 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -104,7 +104,7 @@ else msg += line - if(get_config_value(/decl/config/text/admin_irc)) - to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.") + if(SSwebhooks.is_webhook_configured(WEBHOOK_AHELP_SENT)) + to_chat(src, "Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and join.") to_chat(src, "Current Staff ([active_staff]/[total_staff]):") to_chat(src, jointext(msg,"\n")) diff --git a/code/game/world.dm b/code/game/world.dm index 420c09757f54..079e43ae5439 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,6 +1,6 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) -/hook/global_init/proc/generate_game_id() +/proc/generate_game_id() if(!isnull(global.game_id)) return @@ -70,6 +70,10 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) return match +// Get the URL used to connect to the server. +/proc/get_world_url() + return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" + /world/New() //set window title @@ -83,10 +87,23 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) if(byond_version < REQUIRED_DM_VERSION) to_world_log("Your server's BYOND version does not meet the minimum DM version for this server. Please update BYOND.") - callHook("startup") - //Emergency Fix - load_mods() - //end-emergency fix + // Initialize the global vars decl, which marks vars as protected. + GET_DECL(/decl/global_vars) + // And the offset used for in-game time + global.roundstart_hour = rand(0, 23) + initialise_map_list() + world.load_mode() + world.load_motd() + load_admins() + world.connect_database() + jobban_loadbanfile() + LoadBans() + update_holiday() //Uncommenting ALLOW_HOLIDAYS in configuration will enable this. + try_load_alien_whitelist() + investigate_reset() + // Precache/build trait trees. + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + trait.build_references() . = ..() @@ -149,18 +166,24 @@ var/global/world_topic_last = world.timeofday game_log("World rebooted at [time_stamp()]") - callHook("reboot") + on_reboot(reason) ..(reason) +/// If you need to add modular functionality on-reboot, override this instead of /world/Reboot(). +/// It runs directly before the parent call in /world/Reboot(). +/world/proc/on_reboot(reason) + return + /world/Del() Master.Shutdown() - callHook("shutdown") + on_shutdown() return ..() -/hook/startup/proc/loadMode() - world.load_mode() - return 1 +/// If you need to add modular functionality on-shutdown, override this instead of /world/Del(). +/// It runs directly before the parent call in /world/Del(). +/world/proc/on_shutdown() + return /world/proc/load_mode() if(!fexists("data/mode.txt")) @@ -177,38 +200,9 @@ var/global/world_topic_last = world.timeofday fdel(F) direct_output(F, the_mode) -/hook/startup/proc/loadMOTD() - world.load_motd() - return 1 - /world/proc/load_motd() join_motd = safe_file2text("config/motd.txt", FALSE) -/hook/startup/proc/loadMods() - world.load_mods() - return 1 - -/world/proc/load_mods() - if(get_config_value(/decl/config/toggle/on/admin_legacy_system)) - var/text = safe_file2text("config/moderators.txt", FALSE) - if (!text) - error("Failed to load config/mods.txt") - else - var/list/lines = splittext(text, "\n") - for(var/line in lines) - if (!line) - continue - - if (copytext(line, 1, 2) == ";") - continue - - var/title = "Moderator" - var/rights = admin_ranks[title] - - var/ckey = copytext(line, 1, length(line)+1) - var/datum/admins/D = new /datum/admins(title, rights, ckey) - D.associate(global.ckey_directory[ckey]) - /world/proc/update_status() var/s = "[station_name()]" @@ -281,12 +275,11 @@ var/global/world_topic_last = world.timeofday #define FAILED_DB_CONNECTION_CUTOFF 5 var/global/failed_db_connections = 0 -/hook/startup/proc/connectDB() +/world/proc/connect_database() if(!setup_database_connection()) to_world_log("Your server failed to establish a connection with the SQL database.") else to_world_log("SQL database connection established.") - return 1 /proc/setup_database_connection() diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index c961aed56c7b..10ecd938f694 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -17,7 +17,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return simulated /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - if(locate(/obj/fire) in src) + if((locate(/obj/fire) in src) || !simulated) return 1 var/datum/gas_mixture/air_contents = return_air() diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 5f2e3c19cc60..ecfb5bd522fe 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -59,9 +59,6 @@ var/global/savefile/Banlist CMinutes = (world.realtime / 10) / 60 return 1 -/hook/startup/proc/loadBans() - return LoadBans() - /proc/LoadBans() Banlist = new("data/banlist.bdb") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 79c44208bc00..5e06996ca46f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -789,9 +789,7 @@ var/global/BSACooldown = 0 if (new_vis && !world.reachable) message_admins("WARNING: The server will not show up on the hub because byond is detecting that a firewall is blocking incoming connections.") - var/full_message = "[key_name(src)]" + long_message - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = "[key_name(src)]" + long_message)) log_and_message_admins(long_message) SSstatistics.add_field_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 66fe7e8daff1..546f5753cee8 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -11,10 +11,6 @@ /proc/investigate_subject2file(var/subject) return file("[INVESTIGATE_DIR][subject].html") -/hook/startup/proc/resetInvestigate() - investigate_reset() - return 1 - /proc/investigate_reset() if(fdel(INVESTIGATE_DIR)) return 1 return 0 diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 5a6a4d7b17a1..42eab17d7f73 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -52,10 +52,6 @@ var/global/list/admin_ranks = list() //list of all ranks with associated testing(msg) #endif -/hook/startup/proc/loadAdmins() - load_admins() - return 1 - /proc/load_admins() //clear the datums references admin_datums.Cut() diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 79ca30569ee5..373749683248 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -36,10 +36,6 @@ var/global/list/jobban_keylist = list() //to store the keys & ranks return "Reason Unspecified" return 0 -/hook/startup/proc/loadJobBans() - jobban_loadbanfile() - return 1 - /proc/jobban_loadbanfile() if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) var/savefile/S=new("data/job_full.ban") diff --git a/code/modules/admin/secrets/investigation/admin_pms.dm b/code/modules/admin/secrets/investigation/admin_pms.dm deleted file mode 100644 index cd57bf73283a..000000000000 --- a/code/modules/admin/secrets/investigation/admin_pms.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/admin_secret_item/investigation/admin_pms - name = "Admin PMs" - -/datum/admin_secret_item/investigation/admin_pms/execute(var/mob/user, var/filter) - . = ..() - if(!.) - return - var/dat = list() - dat += "Refresh Filtering on: " - if(filter) - dat += " [filter] Clear" - else - dat += "None" - dat += "
" - dat += "" - dat += "" - - for(var/datum/admin_privat_message/pm in admin_pm_repository.admin_pms_) - var/datum/client_lite/sender = pm.sender - var/datum/client_lite/receiver = pm.receiver - - if(filter && !(sender.ckey == filter || (receiver && receiver.ckey == filter))) - continue - - if(receiver) - dat += "" - else - dat += "" - dat += "" - dat += "
TimeSenderReceiver
[pm.station_time][sender.key_name(FALSE)] F[receiver.key_name(FALSE)] F
[pm.station_time][sender.key_name(FALSE)] F
[pm.message]
" - - var/datum/browser/popup = new(user, "admin_ahelps", "Admin PMs", 800, 400) - popup.set_content(jointext(dat, null)) - popup.open() - -/datum/admin_secret_item/investigation/admin_pms/Topic(href, href_list) - . = ..() - if(.) - return - execute(usr, href_list["filter"]) diff --git a/code/modules/admin/ticket.dm b/code/modules/admin/ticket.dm index 526c9867927f..8612a5306d92 100644 --- a/code/modules/admin/ticket.dm +++ b/code/modules/admin/ticket.dm @@ -51,7 +51,6 @@ var/global/list/ticket_panels = list() src.closed_by = closed_by to_chat(client_by_ckey(src.owner.ckey), "Your ticket has been closed by [closed_by.key].") message_staff("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") - send2adminirc("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticket Closed", "body" = "[src.owner.key_name(0)] 's ticket (ID [id]) has been closed by [closed_by.key].")) var/closed_by_not_assigned = TRUE @@ -100,7 +99,6 @@ var/global/list/ticket_panels = list() ticket_take.Execute() message_staff("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") - send2adminirc("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") to_chat(client_by_ckey(src.owner.ckey), "[assigned_admin.key] has added themself to your ticket and should respond shortly. Thanks for your patience!") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticked Assigned", "body" = "[assigned_admin.key] has added themself to ticket ID [id].")) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ee9f73e756b3..77017eee5f6c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -134,10 +134,6 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo to_chat(src, SPAN_BLUE("PM to-Staff (CLOSE): [original_msg]")) var/admin_number_present = global.admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") - if(admin_number_present <= 0) - adminmsg2adminirc(src, null, "[html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") - else - adminmsg2adminirc(src, null, "[html_decode(original_msg)]") SSstatistics.add_field_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index d3e506f63279..7371ff70873f 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -151,7 +151,6 @@ sound_to(C, 'sound/effects/adminhelp.ogg') log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") - adminmsg2adminirc(src, C, html_decode(msg)) ticket.msgs += new /datum/ticket_msg(src.ckey, C.ckey, msg) update_ticket_panels() @@ -168,31 +167,3 @@ continue if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD)) to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0, ticket)] to [key_name(C, X, 0, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]") - -/client/proc/cmd_admin_irc_pm(sender) - if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") - return - - var/msg = input(src,"Message:", "Reply private message to [sender] on IRC / 400 character limit") as text|null - - if(!msg) - return - - // Handled on Bot32's end, unsure about other bots -// if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. -// to_chat(src, "Your message was not sent because it was more then 400 characters, find your message below for ease of copy/pasting.") -// to_chat(src, "[msg]") -// return - - adminmsg2adminirc(src, sender, html_decode(msg)) - msg = sanitize(msg) - log_admin("PM: [key_name(src)]->IRC-[sender]: [msg]") - admin_pm_repository.store_pm(src, "IRC-[sender]", msg) - - to_chat(src, "" + create_text_tag("pm_out_alt", "PM", src) + " to [sender]: [msg]") - for(var/client/X in global.admins) - if(X == src) - continue - if(X.holder.rights & R_ADMIN|R_MOD) - to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0)] to [sender]: [msg]") diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 9cec7322e10b..f1118e682c96 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -599,9 +599,9 @@ href_list["datumrefresh"] = href_list["mobToDamage"] else if(href_list["call_proc"]) - var/datum/callee = locate(href_list["call_proc"]) - if(istype(callee) || istype(callee, /client)) // can call on clients too, not just datums - callproc_targetpicked(1, callee) + var/datum/called_proc = locate(href_list["call_proc"]) + if(istype(called_proc) || istype(called_proc, /client)) // can call on clients too, not just datums + callproc_targetpicked(1, called_proc) else if(href_list["addaura"]) if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return var/mob/living/victim = locate(href_list["addaura"]) diff --git a/code/modules/atmospherics/_atmos_setup.dm b/code/modules/atmospherics/_atmos_setup.dm index 57b3c67d140a..74d85deb11a1 100644 --- a/code/modules/atmospherics/_atmos_setup.dm +++ b/code/modules/atmospherics/_atmos_setup.dm @@ -17,10 +17,10 @@ var/global/list/pipe_colors = list( "white" = PIPE_COLOR_WHITE, "dark gray" = COLOR_DARK_GRAY) -/proc/pipe_color_check(var/color) +/obj/machinery/atmospherics/proc/pipe_color_check(var/color) if(!color) - return 1 + return TRUE for(var/C in pipe_colors) if(color == pipe_colors[C]) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 49437ef28d4e..55afc98fd37f 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -27,6 +27,11 @@ . = ..() add_filter("glow",1, list(type = "drop_shadow", x = 0, y = 0, offset = 0, size = 4)) +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/pipe_color_check(var/color) + if (color == initial(pipe_color)) + return TRUE + return FALSE + /obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_dir(new_dir) . = ..() initialize_directions_he = get_initialize_directions() // all directions are HE diff --git a/code/modules/augment/active/armblades.dm b/code/modules/augment/active/armblades.dm index 3b622668915d..1f214a266fed 100644 --- a/code/modules/augment/active/armblades.dm +++ b/code/modules/augment/active/armblades.dm @@ -24,6 +24,8 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/armblade/reset_matter() matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/armblade/claws @@ -44,4 +46,6 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/wolverine/reset_matter() matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/augment/active/tool/engineering.dm b/code/modules/augment/active/tool/engineering.dm index 14e3c94b56eb..b46692f220d6 100644 --- a/code/modules/augment/active/tool/engineering.dm +++ b/code/modules/augment/active/tool/engineering.dm @@ -3,7 +3,6 @@ action_button_name = "Deploy Engineering Tool" desc = "A lightweight augmentation for the engineer on-the-go. This one comes with a series of common tools." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) paths = list( /obj/item/screwdriver/finger, /obj/item/wrench/finger, @@ -14,6 +13,9 @@ ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' +/obj/item/organ/internal/augment/active/polytool/engineer/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/weldingtool/finger name = "digital welder" desc = "A precise, high quality welding tool." diff --git a/code/modules/augment/active/tool/surgical.dm b/code/modules/augment/active/tool/surgical.dm index 808d0c5c24c3..faa771cf3e93 100644 --- a/code/modules/augment/active/tool/surgical.dm +++ b/code/modules/augment/active/tool/surgical.dm @@ -3,10 +3,6 @@ action_button_name = "Deploy Surgical Tool" desc = "Part of a line of biomedical augmentations, this device contains the full set of tools any surgeon would ever need." material = /decl/material/solid/metal/steel - matter = list( - /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT - ) paths = list( /obj/item/bonesetter, /obj/item/cautery, @@ -17,3 +13,9 @@ /obj/item/surgicaldrill ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' + +/obj/item/organ/internal/augment/active/polytool/surgical/reset_matter() + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT + ) \ No newline at end of file diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index 9b43eea445c1..ff96aabde045 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -16,7 +16,9 @@ /obj/item/organ/internal/augment/Initialize() . = ..() organ_tag = pick(allowed_organs) + set_bodytype(/decl/bodytype/prosthetic/augment) update_parent_organ() + reagents?.clear_reagents() // Removing meat from the reagents list. /obj/item/organ/internal/augment/attackby(obj/item/W, mob/user) if(IS_SCREWDRIVER(W) && allowed_organs.len > 1) diff --git a/code/modules/augment/passive/armor.dm b/code/modules/augment/passive/armor.dm index 738e6c278c72..306de5710645 100644 --- a/code/modules/augment/passive/armor.dm +++ b/code/modules/augment/passive/armor.dm @@ -4,7 +4,9 @@ icon_state = "armor-chest" desc = "A flexible composite mesh designed to prevent tearing and puncturing of underlying tissue." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) origin_tech = @'{"materials":4,"engineering":2,"biotech":3}' var/brute_mult = 0.8 - var/burn_mult = 1 \ No newline at end of file + var/burn_mult = 1 + +/obj/item/organ/internal/augment/armor/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) \ No newline at end of file diff --git a/code/modules/augment/passive/boost/muscle.dm b/code/modules/augment/passive/boost/muscle.dm index b9c9bd7f57e8..ca38a5cd2ffe 100644 --- a/code/modules/augment/passive/boost/muscle.dm +++ b/code/modules/augment/passive/boost/muscle.dm @@ -9,10 +9,12 @@ icon_state = "muscule" desc = "Nanofiber tendons powered by an array of actuators to help the wearer mantain speed even while encumbered. You may want to install these in pairs to see a result." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' var/obj/item/organ/internal/augment/boost/muscle/other //we need two for these +/obj/item/organ/internal/augment/boost/muscle/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/organ/internal/augment/boost/muscle/on_add_effects() . = ..() if(!owner) diff --git a/code/modules/augment/passive/boost/reflex.dm b/code/modules/augment/passive/boost/reflex.dm index d249075c4294..a066e9f10740 100644 --- a/code/modules/augment/passive/boost/reflex.dm +++ b/code/modules/augment/passive/boost/reflex.dm @@ -4,11 +4,13 @@ buffs = list(SKILL_COMBAT = 1) injury_debuffs = list(SKILL_COMBAT = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' + +/obj/item/organ/internal/augment/boost/reflex/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/boost/shooting.dm b/code/modules/augment/passive/boost/shooting.dm index d29a67a21be8..59ca29796cb7 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -4,11 +4,13 @@ buffs = list(SKILL_WEAPONS = 1) injury_debuffs = list(SKILL_WEAPONS = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' + +/obj/item/organ/internal/augment/boost/reflex/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' /obj/item/organ/internal/augment/boost/reflex/buff() if((. = ..())) diff --git a/code/modules/augment/passive/nanoaura.dm b/code/modules/augment/passive/nanoaura.dm index e7602677d83e..b18920b72e8f 100644 --- a/code/modules/augment/passive/nanoaura.dm +++ b/code/modules/augment/passive/nanoaura.dm @@ -15,15 +15,16 @@ desc = "Nanomachines, son." action_button_name = "Toggle Nanomachines" material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' + var/obj/aura/nanoaura/aura = null + var/charges = 4 + +/obj/item/organ/internal/augment/active/nanounit/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/gold = MATTER_AMOUNT_TRACE, /decl/material/solid/metal/uranium = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' - - var/obj/aura/nanoaura/aura = null - var/charges = 4 /obj/item/organ/internal/augment/active/nanounit/on_add_effects() . = ..() diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm index 647f3adc73a3..34727eaa11b7 100644 --- a/code/modules/banners/__banner.dm +++ b/code/modules/banners/__banner.dm @@ -1,5 +1,6 @@ /obj/item/banner name = "banner" + base_name = "banner" // necessary for premapped subtypes desc = "A furled-up banner." icon = 'icons/obj/items/banners/banner.dmi' icon_state = ICON_STATE_WORLD @@ -12,7 +13,6 @@ var/hung_desc = "The banner is rather unremarkable." var/banner_type = /obj/item/banner var/embroiderable = TRUE - var/name_prefix var/list/decals var/trim_color @@ -66,11 +66,6 @@ var/global/list/banner_type_to_symbols = list() . = ..() -// 'woven grass banner', 'forked linen banner' -/obj/item/banner/update_name() - . = ..() - SetName("[name_prefix] [name]") - /obj/item/banner/examine(mob/user, distance, infix, suffix) . = ..() var/decorations = get_decal_string() diff --git a/code/modules/species/species_bodytype.dm b/code/modules/bodytype/_bodytype.dm similarity index 81% rename from code/modules/species/species_bodytype.dm rename to code/modules/bodytype/_bodytype.dm index 63d6f7ceabe9..64d2e2f21b08 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/bodytype/_bodytype.dm @@ -4,70 +4,91 @@ var/global/list/bodytypes_by_category = list() decl_flags = DECL_FLAG_MANDATORY_UID abstract_type = /decl/bodytype /// Name used in general. - var/name = "default" + var/name = "default" /// Name used in preference bodytype selection. Defaults to name. var/pref_name /// Seen when examining a prosthetic limb, if non-null. var/desc + /// The base 'standard' icon set for this bodytype's organs. var/icon_base + /// A variant on icon_base for used when a limb has the mutated status. var/icon_deformed + /// An icon used to draw from for cosmetic sprite accessories. var/cosmetics_icon + /// A set of overlays to draw from when a limb has been bandaged. TODO: merge with bandage markings. var/bandages_icon - var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID - var/bodytype_category = BODYTYPE_OTHER - var/limb_icon_intensity = 1.5 + /// A flag used on clothing to determine if this bodytype can wear a given clothing item. + var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID + /// A general label for bodytypes. + var/bodytype_category = BODYTYPE_OTHER + /// A general intensity value applied to limbs during apply_limb_colouration(). + var/limb_icon_intensity + /// A set of states to use when rendering blood over the top of worn clothing. TODO: move this to item icons. var/blood_overlays - var/vulnerable_location = BP_GROIN //organ tag that can be kicked for increased pain, previously `sexybits_location`. - var/limb_blend = ICON_ADD - var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' - var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' - var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' - var/icon_template = 'icons/mob/human_races/species/template.dmi' // Used for mob icon generation for non-32x32 species. - var/ignited_icon = 'icons/mob/OnFire.dmi' + /// An organ tag that can be kicked for increased pain, previously `sexybits_location`. + var/vulnerable_location = BP_GROIN + /// What blend mode should be used when drawing this limb icon? + var/limb_blend = ICON_ADD + /// A set of base icons used to generate damaged states for brute/burn injuries to limbs. + var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' + /// An overlay applied when a mob is 'husked' via burn damage. + var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' + /// An alternate icon set to use when a mob or organ has been skeletonised. + var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' + /// Used for mob icon generation for non-32x32 species. + var/icon_template = 'icons/mob/human_races/species/template.dmi' + /// Drawn over a mob when the mob is on fire. + var/ignited_icon = 'icons/mob/OnFire.dmi' + /// Drawn over mob bodyparts when they are surgically open/retracted. + var/surgery_overlay_icon = 'icons/mob/surgery.dmi' + /// Used to retrieve bodytypes by pronoun type in get_bodytype_by_pronouns() var/associated_gender - var/appearance_flags = 0 // Appearance/display related features. - - /// Used when filing your nails. + /// Appearance/display related features. + var/appearance_flags = 0 + /// What noun is used when filing your nails? var/nail_noun /// What tech levels should limbs of this type use/need? - var/limb_tech = @'{"biotech":2}' - var/icon_cache_uid + var/limb_tech = @'{"biotech":2}' /// Determines if eyes should render on heads using this bodytype. - var/has_eyes = TRUE + var/has_eyes = TRUE /// Prefixed to the initial name of the limb, if non-null. var/modifier_string /// Modifies min and max broken damage for the limb. - var/hardiness = 1 + var/hardiness = 1 /// Applies a slowdown value to this limb. - var/movement_slowdown = 0 + var/movement_slowdown = 0 /// Determines if this bodytype can be repaired by nanopaste, sparks when damaged, can malfunction, and can take EMP damage. - var/is_robotic = FALSE + var/is_robotic = FALSE /// For hands, determines the dexterity value passed to get_manual_dexterity(). If null, defers to species. - var/manual_dexterity = null + var/manual_dexterity = null /// Determines how the limb behaves with regards to manual attachment/detachment. - var/modular_limb_tier = MODULAR_BODYPART_INVALID - // Expected organ types per category, used only for stance checking at time of writing. - var/list/organs_by_category = list() - // Expected organ tags per category, used only for stance checking at time of writing. - var/list/organ_tags_by_category = list() - + var/modular_limb_tier = MODULAR_BODYPART_INVALID + /// Expected organ types per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organs_by_category + /// Expected organ tags per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organ_tags_by_category + /// A set of slot strings to modifier strings, used to modify clothing if the state is available in the icon. var/list/onmob_state_modifiers + /// An intensity value applied to limbs with this bodytype when creating the health status indicator HUD element. var/health_hud_intensity = 1 - - var/pixel_offset_x = 0 // Used for offsetting large icons. - var/pixel_offset_y = 0 // Used for offsetting large icons. - var/pixel_offset_z = 0 // Used for offsetting large icons. - - var/antaghud_offset_x = 0 // As above, but specifically for the antagHUD indicator. - var/antaghud_offset_y = 0 // As above, but specifically for the antagHUD indicator. - - var/eye_offset = 0 // Amount to shift eyes on the Y axis to correct for non-32px height. - - var/z_flags = 0 - - var/list/prone_overlay_offset = list(0, 0) // amount to shift overlays when lying - - // Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages + /// Used for offsetting large icons. + var/pixel_offset_x = 0 + /// Used for offsetting large icons. + var/pixel_offset_y = 0 + /// Used for offsetting large icons. + var/pixel_offset_z = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_x = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_y = 0 + /// Amount to shift eyes on the Y axis to correct for non-32px height. Used downstream, do not remove. + var/eye_offset = 0 + /// Used to apply flags like WIDE_LOAD to nonstandard mobs. + var/z_flags = 0 + /// Amount to shift overlays when lying. TODO: check if this is still needed with KEEP_TOGETHER + var/list/prone_overlay_offset + + /// Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages var/list/default_hug_message var/list/hug_messages = list( BP_L_HAND = list( @@ -88,6 +109,7 @@ var/global/list/bodytypes_by_category = list() ) ) + /// For emotes that check bodytypes for sounds, this list will partially override the general emote_sounds list. var/list/override_emote_sounds = list( "cough" = list( 'sound/voice/emotes/f_cougha.ogg', @@ -97,6 +119,8 @@ var/global/list/bodytypes_by_category = list() 'sound/voice/emotes/f_sneeze.ogg' ) ) + + /// Provides bodytype-specific sounds to emote that need them. var/list/emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle.ogg'), @@ -106,24 +130,26 @@ var/global/list/bodytypes_by_category = list() var/list/broadcast_emote_sounds = list( "swhistle" = list('sound/voice/emotes/summon_whistle.ogg') ) + + /// Sounds that play when a mob with this bodytype goes prone. var/list/bodyfall_sounds = list( 'sound/foley/meat1.ogg', 'sound/foley/meat2.ogg' ) // Used for initializing prefs/preview - var/base_color = COLOR_BLACK - var/base_eye_color = COLOR_BLACK + var/base_color = COLOR_BLACK + var/base_eye_color = COLOR_BLACK /// Used to initialize organ material - var/material = /decl/material/solid/organic/meat + var/organ_material = /decl/material/solid/organic/meat /// Used to initialize organ matter - var/list/matter = null + var/list/matter /// The reagent organs are filled with, which currently affects what mobs that eat the organ will receive. /// TODO: Remove this in a later matter edibility refactor. var/edible_reagent = /decl/material/solid/organic/meat /// A bitfield representing various bodytype-specific features. - var/body_flags = 0 + var/body_flags = 0 /// Used to modify the arterial_bleed_severity of organs. var/arterial_bleed_multiplier = 1 /// Associative list of organ_tag = "encased value". If set, sets the organ's encased var to the corresponding value; used in surgery. @@ -167,53 +193,66 @@ var/global/list/bodytypes_by_category = list() var/vision_organ /// If set, an organ with this tag is required for breathing var/breathing_organ - - var/list/override_organ_types // Used for species that only need to change one or two entries in has_organ. - + /// Used for species that only need to change one or two entries in has_organ. + var/list/override_organ_types + /// Used for comparing ages between mobs. var/age_descriptor = /datum/appearance_descriptor/age + /// Used for comparing various cosmetic properties between mobs. var/list/appearance_descriptors = list( /datum/appearance_descriptor/height = 1, /datum/appearance_descriptor/build = 1 ) - /// Losing an organ from this list will give a grace period of `vital_organ_failure_death_delay` then kill the mob. var/list/vital_organs = list(BP_BRAIN) /// The grace period before mob death when an organ in `vital_organs` is lost var/vital_organ_failure_death_delay = 25 SECONDS + /// The relative size of a mob. Consistent with ITEM_SIZE defines. var/mob_size = MOB_SIZE_MEDIUM - + /// A list of sprite accessories applied to this mob by default. var/list/default_sprite_accessories // Darksight handling /// Fractional multiplier (0 to 1) for the base alpha of the darkness overlay. A value of 1 means darkness is completely invisible. - var/eye_base_low_light_vision = 0 + var/eye_base_low_light_vision = 0 /// The lumcount (turf luminosity) threshold under which adaptive low light vision will begin processing. - var/eye_low_light_vision_threshold = 0.3 + var/eye_low_light_vision_threshold = 0.3 /// Fractional multiplier for the overall effectiveness of low light vision for this species. Caps the final alpha value of the darkness plane. - var/eye_low_light_vision_effectiveness = 0 + var/eye_low_light_vision_effectiveness = 0 /// The rate at which low light vision adjusts towards the final value, as a fractional multiplier of the difference between the current and target alphas. ie. set to 0.15 for a 15% shift towards the target value each tick. var/eye_low_light_vision_adjustment_speed = 0.15 + /// How many tiles can this mob see in the dark? Note that degree of visibility is determined by low light vision vars above, this is just the radius. + var/eye_darksight_range = 2 - // Other eye vars. - var/eye_contaminant_guard = 0 + /// Do the eyes of this bodytype protect against chlorine and such? + var/eye_contaminant_guard = 0 + /// Are the eyes of this bodytype resistant to flashes? var/eye_innate_flash_protection = FLASH_PROTECTION_NONE - var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' - var/apply_eye_colour = TRUE - var/eye_darksight_range = 2 - var/eye_blend = ICON_ADD + /// Icon to draw eye overlays from. + var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' + /// Do the eyes of this mob apply a pref colour like hair? + var/apply_eye_colour = TRUE + /// What blend mode is used to draw eyes onto the mob? + var/eye_blend = ICON_ADD /// Stun from blindness modifier. - var/eye_flash_mod = 1 + var/eye_flash_mod = 1 // Bodytype temperature damage thresholds. - var/cold_level_1 = 243 // Cold damage level 1 below this point. -30 Celsium degrees - var/cold_level_2 = 200 // Cold damage level 2 below this point. - var/cold_level_3 = 120 // Cold damage level 3 below this point. - var/heat_level_1 = 360 // Heat damage level 1 above this point. - var/heat_level_2 = 400 // Heat damage level 2 above this point. - var/heat_level_3 = 1000 // Heat damage level 3 above this point. - - // Temperature comfort levels and strings. + /// Cold damage level 1 below this point. -30 Celsium degrees + var/cold_level_1 = 243 + /// Cold damage level 2 below this point. + var/cold_level_2 = 200 + /// Cold damage level 3 below this point. + var/cold_level_3 = 120 + /// Heat damage level 1 above this point. + var/heat_level_1 = 360 + /// Heat damage level 2 above this point. + var/heat_level_2 = 400 + /// Heat damage level 3 above this point. + var/heat_level_3 = 1000 + + // Above this point, discomfort strings will be shown. var/heat_discomfort_level = 315 + // Below this point, discomfort strings will be shown. var/cold_discomfort_level = 285 /// Aesthetic messages about feeling warm. var/list/heat_discomfort_strings = list( @@ -372,15 +411,19 @@ var/global/list/bodytypes_by_category = list() organ_data["descriptor"] = initial(organ.name) var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) for(var/organ_tag in has_organ) var/obj/item/organ/organ = has_organ[organ_tag] var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) if(LAZYLEN(appearance_descriptors)) for(var/desctype in appearance_descriptors) @@ -394,13 +437,18 @@ var/global/list/bodytypes_by_category = list() appearance_descriptors.Insert(1, age.name) appearance_descriptors[age.name] = age +/decl/bodytype/proc/get_expected_organ_tags_for_category(var/category) + return LAZYACCESS(_organ_tags_by_category, category) + /decl/bodytype/proc/get_expected_organ_count_for_categories(var/list/categories) . = 0 for(var/category in categories) - if(category && (category in organs_by_category)) - . += length(organs_by_category[category]) + if(category && (category in _organs_by_category)) + . += length(_organs_by_category[category]) /decl/bodytype/proc/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) + if(!isnull(limb_icon_intensity)) + applying.SetIntensity(limb_icon_intensity) return applying /decl/bodytype/proc/check_dismember_type_override(var/disintegrate) @@ -717,7 +765,7 @@ var/global/list/bodytypes_by_category = list() for(var/obj/item/organ/internal/innard in limb.internal_organs) var/obj/item/organ/internal/organ_prototype = replacing_organs[innard.organ_tag] if(organ_prototype && istype(innard, organ_prototype)) - innard.set_bodytype(type, override_material || material) + innard.set_bodytype(type, override_material || organ_material) replacing_organs -= innard.organ_tag else limb.owner.remove_organ(innard, FALSE, FALSE, TRUE, TRUE, FALSE) diff --git a/code/modules/species/species_bodytype_abilities.dm b/code/modules/bodytype/bodytype_abilities.dm similarity index 100% rename from code/modules/species/species_bodytype_abilities.dm rename to code/modules/bodytype/bodytype_abilities.dm diff --git a/code/modules/species/species_crystalline_bodytypes.dm b/code/modules/bodytype/bodytype_crystalline.dm similarity index 93% rename from code/modules/species/species_crystalline_bodytypes.dm rename to code/modules/bodytype/bodytype_crystalline.dm index 15c0f6047bb2..138d34bae56d 100644 --- a/code/modules/species/species_crystalline_bodytypes.dm +++ b/code/modules/bodytype/bodytype_crystalline.dm @@ -7,7 +7,7 @@ abstract_type = /decl/bodytype/crystalline limb_tech = @'{"materials":4}' is_robotic = FALSE - material = /decl/material/solid/gemstone/crystal + organ_material = /decl/material/solid/gemstone/crystal body_flags = BODY_FLAG_CRYSTAL_REFORM | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS cold_level_1 = SYNTH_COLD_LEVEL_1 cold_level_2 = SYNTH_COLD_LEVEL_2 diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/bodytype/bodytype_helpers.dm similarity index 96% rename from code/modules/species/species_bodytype_helpers.dm rename to code/modules/bodytype/bodytype_helpers.dm index bff05c2fa816..53e30984d13b 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/bodytype/bodytype_helpers.dm @@ -5,9 +5,7 @@ return "Standing" /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) - if(!icon_cache_uid) - icon_cache_uid = "[sequential_id(/decl/bodytype)]" - return icon_cache_uid + return uid /decl/bodytype/proc/get_bandages_icon(var/mob/living/human/H) return bandages_icon @@ -85,3 +83,6 @@ /decl/bodytype/proc/adjust_status(mob/living/target, condition, amount) return amount + +/decl/bodytype/proc/get_surgery_overlay_icon(var/mob/living/user) + return surgery_overlay_icon diff --git a/code/modules/species/species_bodytype_offsets.dm b/code/modules/bodytype/bodytype_offsets.dm similarity index 84% rename from code/modules/species/species_bodytype_offsets.dm rename to code/modules/bodytype/bodytype_offsets.dm index 6679500a3ebb..e00901891127 100644 --- a/code/modules/species/species_bodytype_offsets.dm +++ b/code/modules/bodytype/bodytype_offsets.dm @@ -32,7 +32,8 @@ The slots that you can use are found in items_clothing.dm and are the inventory // Check the cache for previously made icons. var/modifier = mob?.get_overlay_state_modifier() var/image_key = modifier ? "[modifier]-[mob_icon]-[mob_state]-[color]-[slot]" : "generic-[mob_icon]-[mob_state]-[color]-[slot]" - if(!equip_overlays[image_key]) + var/image/copying = equip_overlays[image_key] + if(!copying) var/icon/final_I = new(icon_template) var/list/shifts = use_equip_adjust[slot] @@ -44,9 +45,15 @@ The slots that you can use are found in items_clothing.dm and are the inventory var/icon/equip = new(mob_icon, icon_state = mob_state, dir = use_dir) var/icon/canvas = new(icon_template) canvas.Blend(equip, ICON_OVERLAY, facing_list[1]+1, facing_list[2]+1) - final_I.Insert(canvas, dir = use_dir) - equip_overlays[image_key] = overlay_image(final_I, color = color, flags = RESET_COLOR) + final_I.Insert(canvas, icon_state = mob_state, dir = use_dir) + copying = overlay_image(final_I, mob_state, color, RESET_COLOR) + equip_overlays[image_key] = copying + var/image/I = new() // We return a copy of the cached image, in case downstream procs mutate it. - I.appearance = equip_overlays[image_key] + I.appearance = copying + // For some reason icon_state is coming back null... + I.icon = copying.icon + I.icon_state = copying.icon_state return I + return overlay_image(mob_icon, mob_state, color, RESET_COLOR) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/bodytype/bodytype_prosthetic.dm similarity index 70% rename from code/modules/organs/prosthetics/prosthetics_manufacturer.dm rename to code/modules/bodytype/bodytype_prosthetic.dm index e687a696f637..c01812a75787 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/bodytype/bodytype_prosthetic.dm @@ -1,18 +1,20 @@ /decl/bodytype/prosthetic - abstract_type = /decl/bodytype/prosthetic - icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' - desc = "A generic unbranded robotic prosthesis." - limb_tech = @'{"engineering":1,"materials":1,"magnets":1}' - modifier_string = "robotic" - is_robotic = TRUE - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT - material = /decl/material/solid/metal/steel - appearance_flags = HAS_EYE_COLOR - eye_flash_mod = 1 - eye_darksight_range = 2 - associated_gender = null + abstract_type = /decl/bodytype/prosthetic + icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' + surgery_overlay_icon = null + desc = "A generic unbranded robotic prosthesis." + limb_tech = @'{"engineering":1,"materials":1,"magnets":1}' + modifier_string = "robotic" + is_robotic = TRUE + body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_EAT + organ_material = /decl/material/solid/metal/steel + appearance_flags = HAS_EYE_COLOR + eye_flash_mod = 1 + eye_darksight_range = 2 + associated_gender = null + edible_reagent = null emote_sounds = list( - "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), + "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), "swhistle" = list('sound/voice/emotes/summon_whistle_robot.ogg'), "wwhistle" = list('sound/voice/emotes/wolfwhistle_robot.ogg') @@ -37,17 +39,20 @@ BP_EYES = /obj/item/organ/internal/eyes, BP_CELL = /obj/item/organ/internal/cell ) - cold_level_1 = SYNTH_COLD_LEVEL_1 - cold_level_2 = SYNTH_COLD_LEVEL_2 - cold_level_3 = SYNTH_COLD_LEVEL_3 - heat_level_1 = SYNTH_HEAT_LEVEL_1 - heat_level_2 = SYNTH_HEAT_LEVEL_2 - heat_level_3 = SYNTH_HEAT_LEVEL_3 + cold_discomfort_strings = null - heat_discomfort_level = 373.15 + cold_level_1 = SYNTH_COLD_LEVEL_1 + cold_level_2 = SYNTH_COLD_LEVEL_2 + cold_level_3 = SYNTH_COLD_LEVEL_3 + + heat_level_1 = SYNTH_HEAT_LEVEL_1 + heat_level_2 = SYNTH_HEAT_LEVEL_2 + heat_level_3 = SYNTH_HEAT_LEVEL_3 + heat_discomfort_level = 373.15 heat_discomfort_strings = list( "You are dangerously close to overheating!" ) + /// Determines which bodyparts can use this limb. var/list/applies_to_part /// Prosthetics of this type are not available in chargen unless the map has the required tech level. diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/bodytype/bodytype_prosthetic_models.dm similarity index 78% rename from code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm rename to code/modules/bodytype/bodytype_prosthetic_models.dm index 8c570b2e0876..de7115f982b1 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/bodytype/bodytype_prosthetic_models.dm @@ -15,8 +15,13 @@ is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/wood/oak + organ_material = /decl/material/solid/organic/wood/oak required_map_tech = MAP_TECH_LEVEL_MEDIEVAL uid = "bodytype_prosthetic_wooden" DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/wooden, pirate, 0, "wooden") + +// Dummy/stub prosthetic type for augment implants. +/decl/bodytype/prosthetic/augment + name = "Augment" + uid = "bodytype_prosthetic_augment" diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/bodytype/bodytype_quadruped.dm similarity index 100% rename from code/modules/species/species_bodytype_quadruped.dm rename to code/modules/bodytype/bodytype_quadruped.dm diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/bodytype/bodytype_random.dm similarity index 100% rename from code/modules/species/species_bodytype_random.dm rename to code/modules/bodytype/bodytype_random.dm diff --git a/code/modules/butchery/butchery_data_misc.dm b/code/modules/butchery/butchery_data_misc.dm index 60aa3f2e6ff9..54720ce3b742 100644 --- a/code/modules/butchery/butchery_data_misc.dm +++ b/code/modules/butchery/butchery_data_misc.dm @@ -4,7 +4,7 @@ meat_type = /obj/item/stack/material/rods bone_material = /decl/material/solid/metal/titanium - bone_type = /obj/item/stack/material/strut + bone_type = /obj/item/stack/material/rods skin_material = /decl/material/solid/metal/aluminium skin_type = /obj/item/stack/material/sheet/shiny diff --git a/code/modules/butchery/butchery_hook.dm b/code/modules/butchery/butchery_hook.dm index ae3ea54b8dde..0cc357e6f75a 100644 --- a/code/modules/butchery/butchery_hook.dm +++ b/code/modules/butchery/butchery_hook.dm @@ -19,7 +19,7 @@ ) tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/mob/living/occupant var/occupant_state = CARCASS_EMPTY diff --git a/code/modules/chat_filter/_chat_filter.dm b/code/modules/chat_filter/_chat_filter.dm index 15beabc9ba0d..7e9ce18e77a0 100644 --- a/code/modules/chat_filter/_chat_filter.dm +++ b/code/modules/chat_filter/_chat_filter.dm @@ -1,7 +1,7 @@ var/global/list/chat_blockers_in_use var/global/list/chat_modifiers_in_use -/hook/startup/proc/build_filter_lists() +/proc/build_filter_lists() global.chat_blockers_in_use = list() global.chat_modifiers_in_use = list() var/list/all_filters = decls_repository.get_decls_of_type(/decl/chat_filter) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4afacdc2b068..76f96bf08661 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -65,16 +65,6 @@ var/global/list/localhost_addresses = list( cmd_admin_pm(C, null, ticket) return - if(href_list["irc_msg"]) - if(!holder && received_irc_pm < world.time - 6000) //Worst they can do is spam IRC for 10 minutes - to_chat(usr, SPAN_WARNING("You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you.")) - return - if(mute_irc) - to_chat(usr, SPAN_WARNING("You cannot use this as your client has been muted from sending messages to the admins on IRC.")) - return - cmd_admin_irc_pm(href_list["irc_msg"]) - return - if(href_list["close_ticket"]) var/datum/ticket/ticket = locate(href_list["close_ticket"]) @@ -378,14 +368,10 @@ var/global/list/localhost_addresses = list( if(admin_datums[ckey] && GAME_STATE == RUNLEVEL_GAME) //Only report this stuff if we are currently playing. message_staff("\[[holder.rank]\] [key_name(src)] logged out.") if(!global.admins.len) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell. - var/full_message = "[key_name(src)] logged out - no more staff online." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = "[key_name(src)] logged out - no more staff online.")) if(get_config_value(/decl/config/toggle/delist_when_no_admins) && get_config_value(/decl/config/toggle/hub_visibility)) toggle_config_value(/decl/config/toggle/hub_visibility) - full_message = "Toggled hub visibility. The server is now invisible." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = "Toggled hub visibility. The server is now invisible.")) //checks if a client is afk //3000 frames = 5 minutes diff --git a/code/modules/client/preference_setup/general/05_flavor.dm b/code/modules/client/preference_setup/general/05_flavor.dm index e34ae4c9dc39..803e65cee7cb 100644 --- a/code/modules/client/preference_setup/general/05_flavor.dm +++ b/code/modules/client/preference_setup/general/05_flavor.dm @@ -54,11 +54,11 @@ if("open") pass() if("general") - var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg else - var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg SetFlavorText(user) @@ -69,11 +69,11 @@ if("open") pass() if("Default") - var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg else - var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg SetFlavourTextRobot(user) diff --git a/code/modules/client/preference_setup/global/03_pai.dm b/code/modules/client/preference_setup/global/03_pai.dm index 61c829512864..aeef174d4ffd 100644 --- a/code/modules/client/preference_setup/global/03_pai.dm +++ b/code/modules/client/preference_setup/global/03_pai.dm @@ -67,13 +67,13 @@ if(!isnull(t) && CanUseTopic(user)) candidate.comments = sanitize(t) if("chassis") - t = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis + t = input(user,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis if(!isnull(t) && CanUseTopic(user)) candidate.chassis = t update_pai_preview(user) . = TOPIC_HARD_REFRESH if("say") - t = input(usr,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs + t = input(user,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs if(!isnull(t) && CanUseTopic(user)) candidate.say_verb = t if("cyclebg") diff --git a/code/modules/client/preference_setup/loadout/lists/accessories.dm b/code/modules/client/preference_setup/loadout/lists/accessories.dm index 7f43717605be..739dc589b36c 100644 --- a/code/modules/client/preference_setup/loadout/lists/accessories.dm +++ b/code/modules/client/preference_setup/loadout/lists/accessories.dm @@ -51,6 +51,32 @@ path = /obj/item/clothing/neck/necklace loadout_flags = GEAR_HAS_COLOR_SELECTION uid = "gear_accessory_necklace" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum + ) + +/decl/loadout_option/accessory/necklace/get_gear_tweak_options() + . = ..() + LAZYINITLIST(.[/datum/gear_tweak/path]) + .[/datum/gear_tweak/path] |= list( + "necklace" = /obj/item/clothing/neck/necklace, + "necklace, square pendant" = /obj/item/clothing/neck/necklace/square, + "necklace, frill" = /obj/item/clothing/neck/necklace/frill, + "necklace, cross pendant" = /obj/item/clothing/neck/necklace/cross, + "necklace, diamond pendant" = /obj/item/clothing/neck/necklace/diamond, + "necklace, ornate" = /obj/item/clothing/neck/necklace/ornate + ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials /decl/loadout_option/accessory/bow name = "bowtie, horrible" diff --git a/code/modules/client/preference_setup/loadout/lists/gloves.dm b/code/modules/client/preference_setup/loadout/lists/gloves.dm index 94387e8dee26..c923ba47b6bb 100644 --- a/code/modules/client/preference_setup/loadout/lists/gloves.dm +++ b/code/modules/client/preference_setup/loadout/lists/gloves.dm @@ -24,20 +24,39 @@ path = /obj/item/clothing/gloves/ring cost = 2 uid = "gear_gloves_ring" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum, + /decl/material/solid/glass, + /decl/material/solid/organic/plastic, + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/bamboo, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/walnut, + /decl/material/solid/organic/wood/yew + ) /decl/loadout_option/ring/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path]) .[/datum/gear_tweak/path] |= list( - "engagement ring" = /obj/item/clothing/gloves/ring/engagement, - "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, - "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason, - "ring, steel" = /obj/item/clothing/gloves/ring/material/steel, - "ring, bronze" = /obj/item/clothing/gloves/ring/material/bronze, - "ring, silver" = /obj/item/clothing/gloves/ring/material/silver, - "ring, gold" = /obj/item/clothing/gloves/ring/material/gold, - "ring, platinum" = /obj/item/clothing/gloves/ring/material/platinum, - "ring, glass" = /obj/item/clothing/gloves/ring/material/glass, - "ring, wood" = /obj/item/clothing/gloves/ring/material/wood, - "ring, plastic" = /obj/item/clothing/gloves/ring/material/plastic + "ring" = /obj/item/clothing/gloves/ring/gold, + "ring, thin" = /obj/item/clothing/gloves/ring/thin, + "ring, thick" = /obj/item/clothing/gloves/ring/thick, + "ring, split" = /obj/item/clothing/gloves/ring/split, + "engagement ring" = /obj/item/clothing/gloves/ring/engagement, + "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, + "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 4c2a1259995f..744bcdb78135 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -9,7 +9,6 @@ icon_state = ICON_STATE_WORLD _base_attack_force = 3 - var/wizard_garb = 0 var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. var/tint = TINT_NONE // Sets the item's level of visual impairment tint. var/bodytype_equip_flags // Bitfields; if null, checking is skipped. Determine if a given mob can equip this item or not. diff --git a/code/modules/clothing/costumes/_costume.dm b/code/modules/clothing/costumes/_costume.dm index 1afd7a2643f1..bb0035a8e63b 100644 --- a/code/modules/clothing/costumes/_costume.dm +++ b/code/modules/clothing/costumes/_costume.dm @@ -6,8 +6,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm index 11570f7b552f..c29c27b6734b 100644 --- a/code/modules/clothing/dresses/_dress.dm +++ b/code/modules/clothing/dresses/_dress.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/dress/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 78a5fedc480e..5802d8fe8b91 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -104,9 +104,9 @@ /obj/item/clothing/glasses/update_clothing_icon() . = ..() - if(.) - var/mob/M = loc - M.update_action_buttons() + if(. && ismob(loc)) + var/mob/wearer = loc + wearer.update_action_buttons() /obj/item/clothing/glasses/proc/toggle() set category = "Object" diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index b97d5aed8430..78696640604a 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -17,10 +17,6 @@ fallback_slot = slot_gloves_str var/obj/item/clothing/gloves/ring/covering_ring -/obj/item/clothing/gloves/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_gloves_str) - /obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) return diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index 7b39b2596043..b9e58beedf62 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -1,11 +1,15 @@ /obj/item/clothing/gloves/ring - name = "ring" - icon = 'icons/clothing/accessories/jewelry/rings/ring.dmi' - w_class = ITEM_SIZE_TINY - gender = NEUTER - material = /decl/material/solid/metal/silver + name = "ring" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band.dmi' + desc = null + w_class = ITEM_SIZE_TINY + gender = NEUTER + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_DESC // We handle name manually + sprite_sheets = null + var/use_material_name = TRUE var/can_fit_under_gloves = TRUE - var/can_inscribe = FALSE + var/can_inscribe = TRUE var/inscription var/base_desc @@ -14,6 +18,24 @@ base_desc = desc . = ..() +/obj/item/clothing/gloves/ring/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + if(!on_mob && istype(thing, /obj/item/gemstone)) + return thing.icon + return ..() + +/obj/item/clothing/gloves/ring/update_name() + var/list/name_comp = list() + if(name_prefix) + name_comp += name_prefix + if(use_material_name) + var/obj/item/gemstone/gem = locate() in contents + if(gem) + name_comp += gem.name + if(material) + name_comp += material.adjective_name + name_comp += base_name || initial(name) + SetName(jointext(name_comp, " ")) + /obj/item/clothing/gloves/ring/set_material(var/new_material) . = ..() update_desc() @@ -32,7 +54,7 @@ desc = "[base_desc] [desc]" /obj/item/clothing/gloves/ring/attackby(var/obj/item/tool, var/mob/user) - if(can_inscribe && tool.sharp) + if(can_inscribe && tool.sharp && user.check_intent(I_FLAG_HELP)) var/new_inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) if(user.stat || !user.incapacitated() || !user.Adjacent(src) || tool.loc != user) return TRUE @@ -55,4 +77,47 @@ /obj/item/clothing/gloves/ring/get_examine_line() . = ..() - . += " \[View\]" \ No newline at end of file + . += " \[View\]" + +// Craftable subtypes. +/obj/item/clothing/gloves/ring/thin + name_prefix = "thin" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi' + +/obj/item/clothing/gloves/ring/thick + name_prefix = "thick" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + +/obj/item/clothing/gloves/ring/split + name_prefix = "split" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_split.dmi' + +// Material subtypes for mapping etc. +/obj/item/clothing/gloves/ring/wood + material = /decl/material/solid/organic/wood/walnut + +/obj/item/clothing/gloves/ring/plastic + material = /decl/material/solid/organic/plastic + +/obj/item/clothing/gloves/ring/steel + material = /decl/material/solid/metal/steel + +/obj/item/clothing/gloves/ring/silver + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/gloves/ring/platinum + material = /decl/material/solid/metal/platinum + +/obj/item/clothing/gloves/ring/bronze + material = /decl/material/solid/metal/bronze + +/obj/item/clothing/gloves/ring/glass + material = /decl/material/solid/glass + +/obj/item/clothing/gloves/ring/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + decorations = list(pick(global.random_jewellery_gem_types)) + . = ..() diff --git a/code/modules/clothing/gloves/jewelry/rings/material.dm b/code/modules/clothing/gloves/jewelry/rings/material.dm deleted file mode 100644 index 1f4492cffc23..000000000000 --- a/code/modules/clothing/gloves/jewelry/rings/material.dm +++ /dev/null @@ -1,24 +0,0 @@ -///////////////////////////////////////// -//Material Rings -//TODO: Repath to /obj/item/clothing/gloves/ring/crafted? -//Also, maybe move can_inscribe = TRUE down to the base ring? -/obj/item/clothing/gloves/ring/material - material_alteration = MAT_FLAG_ALTERATION_ALL - can_inscribe = TRUE - -/obj/item/clothing/gloves/ring/material/wood - material = /decl/material/solid/organic/wood/walnut -/obj/item/clothing/gloves/ring/material/plastic - material = /decl/material/solid/organic/plastic -/obj/item/clothing/gloves/ring/material/steel - material = /decl/material/solid/metal/steel -/obj/item/clothing/gloves/ring/material/silver - material = /decl/material/solid/metal/silver -/obj/item/clothing/gloves/ring/material/gold - material = /decl/material/solid/metal/gold -/obj/item/clothing/gloves/ring/material/platinum - material = /decl/material/solid/metal/platinum -/obj/item/clothing/gloves/ring/material/bronze - material = /decl/material/solid/metal/bronze -/obj/item/clothing/gloves/ring/material/glass - material = /decl/material/solid/glass diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm new file mode 100644 index 000000000000..2a6c167d7feb --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/gloves/ring/aura_ring + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + can_inscribe = FALSE + material = /decl/material/solid/metal/silver + abstract_type = /obj/item/clothing/gloves/ring/aura_ring + material_alteration = MAT_FLAG_ALTERATION_COLOR + var/obj/aura/granted_aura + +/obj/item/clothing/gloves/ring/aura_ring/update_name() + return + +/obj/item/clothing/gloves/ring/aura_ring/Initialize() + if(ispath(granted_aura)) + granted_aura = new granted_aura + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/Destroy() + QDEL_NULL(granted_aura) + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) + ..() + if(istype(granted_aura) && slot == slot_gloves_str) + L.add_aura(granted_aura) + +/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) + ..() + if(istype(granted_aura)) + L.remove_aura(granted_aura) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm new file mode 100644 index 000000000000..7660a833859d --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm @@ -0,0 +1,24 @@ +///////////////////////////////////////// +//Standard Rings +/obj/item/clothing/gloves/ring/engagement + name = "engagement ring" + desc = "An engagement ring. It certainly looks expensive." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round) + +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) + user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) + +/obj/item/clothing/gloves/ring/cti + name = "\improper CTI ring" + desc = "A ring commemorating graduation from CTI." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round/sapphire) + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/mariner + name = "\improper Mariner University ring" + desc = "A ring commemorating graduation from Mariner University." + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/round/ruby) + use_material_name = FALSE diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm new file mode 100644 index 000000000000..c19417797489 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm @@ -0,0 +1,37 @@ +///////////////////////////////////////// +//Reagent Rings +/obj/item/clothing/gloves/ring/reagent + atom_flags = ATOM_FLAG_OPEN_CONTAINER + origin_tech = @'{"materials":2,"esoteric":4}' + var/tmp/volume = 15 + +/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) + . = ..() + initialize_reagents() + +/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) + if(!reagents) + create_reagents(volume) + else + reagents.maximum_volume = max(volume, reagents.maximum_volume) + . = ..() + +/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) + ..() + if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) + to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) + + if(reagents.total_volume) + if(H.reagents) + var/contained_reagents = reagents.get_reagents() + var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) + admin_inject_log(usr, H, src, contained_reagents, trans) + return + +//Sleepy Ring +/obj/item/clothing/gloves/ring/reagent/sleepy + origin_tech = @'{"materials":2,"esoteric":5}' + +/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() + add_to_reagents(/decl/material/liquid/paralytics, 10) + add_to_reagents(/decl/material/liquid/sedatives, 5) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm new file mode 100644 index 000000000000..9ba92ac56595 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm @@ -0,0 +1,42 @@ +///////////////////////////////////////// +//Seals and Signet Rings +/obj/item/clothing/gloves/ring/seal + name = "signet ring" + desc = "A ring with a heavy setting for pressing into hot wax to seal letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal.dmi' + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/seal/Initialize() + . = ..() + set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) + +/obj/item/clothing/gloves/ring/seal/secretary + name = "\improper Secretary-General's official seal" + desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/mason + name = "masonic ring" + desc = "The Square and Compasses feature prominently on this Masonic ring." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' + material = /decl/material/solid/metal/brass + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/signet + name = "signet ring" + desc = "A signet ring, for when you're too sophisticated to sign letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' + use_material_name = FALSE + var/name_set = FALSE + +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) + if(!user.check_intent(I_FLAG_HELP)) + return ..() + if(name_set) + to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) + else + name_set = TRUE + to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) + base_name = "\the [user]'s signet ring" + desc = "A signet ring belonging to [user], for when they're too sophisticated to sign letters." + return TRUE diff --git a/code/modules/clothing/gloves/jewelry/rings/rings.dm b/code/modules/clothing/gloves/jewelry/rings/rings.dm deleted file mode 100644 index b0d78e0d7faa..000000000000 --- a/code/modules/clothing/gloves/jewelry/rings/rings.dm +++ /dev/null @@ -1,118 +0,0 @@ -///////////////////////////////////////// -//Standard Rings -/obj/item/clothing/gloves/ring/engagement - name = "engagement ring" - desc = "An engagement ring. It certainly looks expensive." - icon = 'icons/clothing/accessories/jewelry/rings/ring_diamond.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) - user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) - -/obj/item/clothing/gloves/ring/cti - name = "CTI ring" - desc = "A ring commemorating graduation from CTI." - icon = 'icons/clothing/accessories/jewelry/rings/ring_cti.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/mariner - name = "Mariner University ring" - desc = "A ring commemorating graduation from Mariner University." - material = /decl/material/solid/metal/gold - icon = 'icons/clothing/accessories/jewelry/rings/ring_mariner.dmi' - -///////////////////////////////////////// -//Magic Rings - -/obj/item/clothing/gloves/ring/magic - name = "magic ring" - desc = "A strange ring with symbols carved on it in some arcane language." - icon = 'icons/clothing/accessories/jewelry/rings/ring_magic.dmi' - material = /decl/material/solid/metal/gold - -/obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/human/H, var/slot) - ..() - if(istype(H) && slot == SLOT_HANDS) - H.add_cloaking_source(src) - -/obj/item/clothing/gloves/ring/magic/dropped(var/mob/living/human/H) - if(!..()) - return 0 - - if(istype(H)) - H.remove_cloaking_source(src) - -///////////////////////////////////////// -//Reagent Rings - -/obj/item/clothing/gloves/ring/reagent - atom_flags = ATOM_FLAG_OPEN_CONTAINER - origin_tech = @'{"materials":2,"esoteric":4}' - var/tmp/volume = 15 - -/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(volume, reagents.maximum_volume) - . = ..() - -/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) - ..() - if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) - to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) - - if(reagents.total_volume) - if(H.reagents) - var/contained_reagents = reagents.get_reagents() - var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) - admin_inject_log(usr, H, src, contained_reagents, trans) - return - -//Sleepy Ring -/obj/item/clothing/gloves/ring/reagent/sleepy - name = "silver ring" - desc = "A ring made from what appears to be silver." - origin_tech = @'{"materials":2,"esoteric":5}' - -/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() - add_to_reagents(/decl/material/liquid/paralytics, 10) - add_to_reagents(/decl/material/liquid/sedatives, 5) - -///////////////////////////////////////// -//Seals and Signet Rings -/obj/item/clothing/gloves/ring/seal - name = "Secretary-General's official seal" - desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi' - material = /decl/material/solid/metal/silver - -/obj/item/clothing/gloves/ring/seal/Initialize() - . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) - -/obj/item/clothing/gloves/ring/seal/mason - name = "masonic ring" - desc = "The Square and Compasses feature prominently on this Masonic ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' - material = /decl/material/solid/metal/brass - -/obj/item/clothing/gloves/ring/seal/signet - name = "signet ring" - desc = "A signet ring, for when you're too sophisticated to sign letters." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' - var/nameset = 0 - -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) - if(nameset) - to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) - return - - nameset = 1 - to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) - name = "[user]'s signet ring" - desc = "A signet ring belonging to [user], for when you're too sophisticated to sign letters." diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index a47285476332..ae91f9dcc1f0 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -57,7 +57,3 @@ light_overlay = image(overlay.icon, "[overlay.icon_state]_light") overlay.overlays += light_overlay . = ..() - -/obj/item/clothing/head/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_head_str) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 19e0a6c4aca2..01d01335e585 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -204,7 +204,7 @@ icon = 'icons/clothing/head/cakehat.dmi' body_parts_covered = SLOT_HEAD item_flags = null - var/is_on_fire = FALSE + VAR_PRIVATE/_on_fire = FALSE /obj/item/clothing/head/cakehat/equipped(mob/user, slot) . = ..() @@ -217,7 +217,7 @@ /obj/item/clothing/head/cakehat/on_update_icon(mob/user) . = ..() z_flags &= ~ZMM_MANGLE_PLANES - if(is_on_fire && check_state_in_icon("[icon_state]-flame", icon)) + if(is_on_fire() && check_state_in_icon("[icon_state]-flame", icon)) if(plane == HUD_PLANE) add_overlay("[icon_state]-flame") else @@ -230,7 +230,7 @@ return emissive_overlay(overlay.icon, "[overlay.icon_state]-flame") /obj/item/clothing/head/cakehat/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) - if(overlay && is_on_fire) + if(overlay && is_on_fire()) var/image/I = get_mob_flame_overlay(overlay, bodytype) if(I) overlay.overlays += I @@ -241,7 +241,7 @@ return ..() /obj/item/clothing/head/cakehat/Process() - if(!is_on_fire) + if(!is_on_fire()) STOP_PROCESSING(SSobj, src) return var/turf/location = loc @@ -255,9 +255,9 @@ /obj/item/clothing/head/cakehat/attack_self(mob/user) . = ..() if(!.) - is_on_fire = !is_on_fire + _on_fire = !_on_fire update_icon() - if(is_on_fire) + if(is_on_fire()) atom_damage_type = BURN START_PROCESSING(SSobj, src) else diff --git a/code/modules/clothing/head/wizard.dm b/code/modules/clothing/head/wizard.dm new file mode 100644 index 000000000000..e4de99269e10 --- /dev/null +++ b/code/modules/clothing/head/wizard.dm @@ -0,0 +1,32 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/head/wizard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins." + icon = 'icons/clothing/head/wizard/wizard.dmi' + body_parts_covered = 0 + +/obj/item/clothing/head/wizard/red + name = "red wizard hat" + icon = 'icons/clothing/head/wizard/red.dmi' + +/obj/item/clothing/head/wizard/beard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." + icon = 'icons/clothing/head/wizard/fake.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE + +/obj/item/clothing/head/wizard/marisa + name = "witch hat" + desc = "Strange-looking hat-wear. Makes you want to cast fireballs." + icon = 'icons/clothing/head/wizard/marisa.dmi' + +/obj/item/clothing/head/wizard/magus + name = "magus helm" + desc = "A mysterious helmet. Hard to see out of." + icon = 'icons/clothing/head/wizard/magus.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + +/obj/item/clothing/head/wizard/cap + name = "gentleman's cap" + desc = "A checkered gray flat cap." + icon = 'icons/clothing/head/flatcap.dmi' diff --git a/code/modules/clothing/jumpsuits/_jumpsuit.dm b/code/modules/clothing/jumpsuits/_jumpsuit.dm index 2e7dede575f1..205a8af7997a 100644 --- a/code/modules/clothing/jumpsuits/_jumpsuit.dm +++ b/code/modules/clothing/jumpsuits/_jumpsuit.dm @@ -15,8 +15,3 @@ GET_DECL(/decl/clothing_state_modifier/rolled_sleeves) ) return expected_state_modifiers - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/masks/_mask.dm b/code/modules/clothing/masks/_mask.dm index 6053880f1720..214afe1c9072 100644 --- a/code/modules/clothing/masks/_mask.dm +++ b/code/modules/clothing/masks/_mask.dm @@ -30,10 +30,6 @@ action_button_name = "Adjust Mask" verbs += .verb/adjust_mask -/obj/item/clothing/mask/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_mask_str) - /obj/item/clothing/mask/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay && hanging && slot == slot_wear_mask_str && check_state_in_icon("[overlay.icon_state]-down", overlay.icon)) overlay.icon_state = "[overlay.icon_state]-down" diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index 594eb26b6aa1..84d490148fb9 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -51,7 +51,7 @@ /obj/item/clothing/mask/chewable/Process() chew(1) if(chewtime < 1) - extinguish() + extinguish_fire() /obj/item/clothing/mask/chewable/tobacco name = "wad" @@ -72,7 +72,7 @@ desc = "A disgusting spitwad." icon = 'icons/clothing/mask/chewables/chew_spit.dmi' -/obj/item/clothing/mask/chewable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/chewable/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) if(type_butt) var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index e74903d380b7..7ceb955904cb 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -93,12 +93,16 @@ w_class = ITEM_SIZE_SMALL siemens_coefficient = 0.9 -/obj/item/clothing/mask/horsehead/Initialize() - . = ..() - // The horse mask doesn't cause voice changes by default, the wizard spell changes the flag as necessary +/obj/item/clothing/mask/horsehead/cursed + voicechange = TRUE say_messages = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") say_verbs = list("whinnies", "neighs", "says") +/obj/item/clothing/mask/horsehead/cursed/equipped(mob/user, slot) + . = ..() + if(slot == slot_wear_mask_str) + canremove = FALSE + /obj/item/clothing/mask/ai name = "camera MIU" desc = "Allows for direct mental connection to accessible camera channels." diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index e36a224c7873..9d5c9cf1a9f6 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -82,7 +82,7 @@ if (src == user.get_equipped_item(slot_wear_mask_str) && user.internal) environment = user.internal.return_air() if(environment.get_by_flag(XGM_GAS_OXIDIZER) < gas_consumption) - extinguish() + extinguish_fire() else environment.remove_by_flag(XGM_GAS_OXIDIZER, gas_consumption) environment.adjust_gas(/decl/material/gas/carbon_dioxide, 0.5*gas_consumption,0) @@ -91,7 +91,7 @@ /obj/item/clothing/mask/smokable/Process() var/turf/location = get_turf(src) if(submerged() || smoketime < 1) - extinguish() + extinguish_fire() return smoke(1) if(location) @@ -126,7 +126,7 @@ var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) - extinguish(no_message = TRUE) + extinguish_fire(no_message = TRUE) /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights \the [src].") if(QDELETED(src)) @@ -152,7 +152,7 @@ smoke_amount = reagents.total_volume / smoketime START_PROCESSING(SSobj, src) -/obj/item/clothing/mask/smokable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) lit = FALSE atom_damage_type = BRUTE STOP_PROCESSING(SSobj, src) @@ -182,7 +182,7 @@ return ..() /obj/item/clothing/mask/smokable/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(target.on_fire) + if(target.is_on_fire()) user.do_attack_animation(target) light(SPAN_NOTICE("\The [user] coldly lights the \the [src] with the burning body of \the [target].")) return TRUE @@ -221,7 +221,7 @@ if(is_processing) set_scent_by_reagents(src) -/obj/item/clothing/mask/smokable/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) ..() remove_extension(src, /datum/extension/scent) if (type_butt) @@ -384,7 +384,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE - if(!lit && target.on_fire) + if(!lit && target.is_on_fire()) user.do_attack_animation(target) light(target, user) return TRUE @@ -412,7 +412,7 @@ /obj/item/clothing/mask/smokable/cigarette/attack_self(var/mob/user) if(lit == 1) user.visible_message(SPAN_NOTICE("[user] calmly drops and treads on the lit [src], putting it out instantly.")) - extinguish(no_message = 1) + extinguish_fire(no_message = TRUE) return ..() //////////// @@ -530,7 +530,7 @@ set_scent_by_reagents(src) update_icon() -/obj/item/clothing/mask/smokable/pipe/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/pipe/extinguish_fire(mob/user, no_message) ..() new /obj/effect/decal/cleanable/ash(get_turf(src)) if(ismob(loc)) diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm deleted file mode 100644 index 77290be1f70a..000000000000 --- a/code/modules/clothing/neck/jewelry.dm +++ /dev/null @@ -1,71 +0,0 @@ -/obj/item/clothing/neck/necklace - name = "necklace" - desc = "A simple necklace." - icon = 'icons/clothing/accessories/jewelry/necklace.dmi' - material = /decl/material/solid/metal/silver - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - -/obj/item/clothing/neck/necklace/prayer_beads - name = "prayer beads" - desc = "A string of smooth, polished beads." - icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' - gender = PLURAL - material = /decl/material/solid/organic/wood/ebony - -/obj/item/clothing/neck/necklace/prayer_beads/gold - material = /decl/material/solid/metal/gold - -/obj/item/clothing/neck/necklace/prayer_beads/basalt - material = /decl/material/solid/stone/basalt - -/obj/item/clothing/neck/necklace/prayer_beads/random - var/list/random_materials = list( - /decl/material/solid/organic/bone, - /decl/material/solid/stone/marble, - /decl/material/solid/stone/basalt, - /decl/material/solid/organic/wood/mahogany, - /decl/material/solid/organic/wood/ebony - ) - -/obj/item/clothing/neck/necklace/prayer_beads/random/Initialize() - material = pick(random_materials) - return ..() - -/obj/item/clothing/neck/necklace/locket - name = "locket" - desc = "A locket that seems to have space for a photo within." - icon = 'icons/clothing/accessories/jewelry/locket.dmi' - var/open - var/obj/item/held - -/obj/item/clothing/neck/necklace/locket/attack_self(mob/user) - if(!("[get_world_inventory_state()]-open" in icon_states(icon))) - to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) - return TRUE - open = !open - to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) - if(open && held) - to_chat(user, SPAN_DANGER("\The [held] falls out!")) - held.dropInto(user.loc) - held = null - update_icon() - return TRUE - -/obj/item/clothing/neck/necklace/locket/on_update_icon() - . = ..() - icon_state = get_world_inventory_state() - if(open && check_state_in_icon("[icon_state]-open", icon)) - icon_state = "[icon_state]-open" - -/obj/item/clothing/neck/necklace/locket/attackby(var/obj/item/O, mob/user) - if(!open) - to_chat(user, SPAN_WARNING("You have to open it first.")) - return TRUE - if(istype(O,/obj/item/paper) || istype(O, /obj/item/photo)) - if(held) - to_chat(usr, SPAN_WARNING("\The [src] already has something inside it.")) - else if(user.try_unequip(O, src)) - to_chat(usr, SPAN_NOTICE("You slip \the [O] into \the [src].")) - held = O - return TRUE - return ..() diff --git a/code/modules/clothing/neck/necklace/__necklace.dm b/code/modules/clothing/neck/necklace/__necklace.dm new file mode 100644 index 000000000000..a6e680313b6f --- /dev/null +++ b/code/modules/clothing/neck/necklace/__necklace.dm @@ -0,0 +1,97 @@ +/obj/item/clothing/neck/necklace + name = "necklace" + desc = "A fine chain worn around the neck." + icon = 'icons/clothing/accessories/jewelry/necklace.dmi' + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/obj/item/pendant/pendant + +/obj/item/clothing/neck/necklace/Initialize() + . = ..() + if(ispath(pendant)) + set_pendant(new pendant(src, material?.type)) + +/obj/item/clothing/neck/necklace/Destroy() + set_pendant(null) + return ..() + +/obj/item/clothing/neck/necklace/proc/set_pendant(obj/item/new_pendant) + if(pendant == new_pendant) + return FALSE + pendant = new_pendant + update_icon() + return TRUE + +/obj/item/clothing/neck/necklace/examine(mob/user) + . = ..() + if(istype(pendant)) + to_chat(user, "There is \a [pendant] attached.") + +/obj/item/clothing/neck/necklace/on_update_icon() + . = ..() + if(istype(pendant)) + var/list/pendant_overlays = pendant.get_pendant_overlays(icon_state) + if(length(pendant_overlays)) + add_overlay(pendant_overlays) + +/obj/item/clothing/neck/necklace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && istype(pendant)) + var/pendant_overlays = pendant.get_pendant_overlays(overlay.icon_state) + if(pendant_overlays) + overlay.overlays += pendant_overlays + return ..() + +/obj/item/clothing/neck/necklace/attack_self(mob/user) + if(pendant?.attack_self(user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/pendant)) + if(istype(pendant)) + to_chat(user, SPAN_WARNING("\The [src] doesn't have room for \the [used_item].")) + else if(user.try_unequip(used_item, src)) + set_pendant(used_item) + update_icon() + to_chat(user, SPAN_NOTICE("You attach \the [pendant] to \the [src].")) + return TRUE + if(pendant?.attackby(used_item, user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/get_alt_interactions(mob/user) + . = ..() + if(istype(pendant)) + LAZYADD(., /decl/interaction_handler/remove_pendant) + +/decl/interaction_handler/remove_pendant + name = "Remove Pendant" + expected_target_type = /obj/item/clothing/neck/necklace + +/decl/interaction_handler/remove_pendant/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/clothing/neck/necklace/necklace = target + if(!necklace.pendant) + return FALSE + necklace.pendant.dropInto(user.loc) + user.put_in_hands(necklace.pendant) + necklace.set_pendant(null) + return TRUE + +// Loadout subtypes. +/obj/item/clothing/neck/necklace/prism + pendant = /obj/item/pendant/prism + +/obj/item/clothing/neck/necklace/frill + pendant = /obj/item/pendant/frill + +/obj/item/clothing/neck/necklace/square + pendant = /obj/item/pendant/setting/square + +/obj/item/clothing/neck/necklace/cross + pendant = /obj/item/pendant/setting/cross + +/obj/item/clothing/neck/necklace/diamond + pendant = /obj/item/pendant/setting/diamond + +/obj/item/clothing/neck/necklace/ornate + pendant = /obj/item/pendant/setting/ornate diff --git a/code/modules/clothing/neck/necklace/_pendant.dm b/code/modules/clothing/neck/necklace/_pendant.dm new file mode 100644 index 000000000000..d29a9e6af27f --- /dev/null +++ b/code/modules/clothing/neck/necklace/_pendant.dm @@ -0,0 +1,51 @@ +/obj/item/pendant + name = "pendant" + desc = "A simple pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + abstract_type = /obj/item/pendant + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR // We do manual name/desc handling for the gem. + +// I swear we had a proc for this on /obj/item? +/obj/item/pendant/set_material(new_material) + . = ..() + if(material) + desc = "[desc] This one is made of [material.solid_name]." + +/obj/item/pendant/update_name() + var/list/name_comp = get_name_components() + if(length(name_comp)) + SetName(jointext(name_comp, " ")) + +/obj/item/pendant/proc/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + . += base_name || initial(name) + +/obj/item/pendant/proc/get_pendant_base_state(base_state) + return base_state + +/obj/item/pendant/proc/get_pendant_overlays(base_state) + base_state = get_pendant_base_state(base_state) + var/list/overlay_states = list((base_state) = get_color()) + for(var/decl/item_decoration/decoration as anything in decorations) + overlay_states["[base_state]-[decoration.icon_state_modifier]"] = decoration.resolve_color(src) + . = list() + for(var/overlay_state in overlay_states) + if(check_state_in_icon(overlay_state, icon)) + . += overlay_image(icon, overlay_state, overlay_states[overlay_state], RESET_COLOR) + +// Subtypes below. +/obj/item/pendant/prism + name = "prism" + desc = "A large prism-shaped pendant that hangs from a clasp." + icon = 'icons/clothing/accessories/jewelry/pendants/crystal.dmi' + material = /decl/material/solid/gemstone/diamond + +/obj/item/pendant/frill + name = "chain frill" + icon = 'icons/clothing/accessories/jewelry/pendants/frill.dmi' + desc = "A set of fine chain frills." diff --git a/code/modules/clothing/neck/necklace/necklaces.dm b/code/modules/clothing/neck/necklace/necklaces.dm new file mode 100644 index 000000000000..1cc8ef598c26 --- /dev/null +++ b/code/modules/clothing/neck/necklace/necklaces.dm @@ -0,0 +1,15 @@ +// Subtypes for mapping etc. +/obj/item/clothing/neck/necklace/locket + pendant = /obj/item/pendant/locket + +/obj/item/clothing/neck/necklace/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + pendant = pick(list( + /obj/item/pendant/setting/cross/random, + /obj/item/pendant/setting/square/random, + /obj/item/pendant/setting/diamond/random, + /obj/item/pendant/setting/ornate/random, + /obj/item/pendant/prism/random, + /obj/item/pendant/frill/random + )) + return ..() diff --git a/code/modules/clothing/neck/necklace/pendant_locket.dm b/code/modules/clothing/neck/necklace/pendant_locket.dm new file mode 100644 index 000000000000..930f7c927e38 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_locket.dm @@ -0,0 +1,50 @@ +/obj/item/pendant/locket + name = "locket" + desc = "A locket that seems to have space for a photo within." + icon = 'icons/clothing/accessories/jewelry/pendants/locket.dmi' + var/open + var/obj/item/held + +/obj/item/pendant/locket/attack_self(mob/user) + if(!("[get_world_inventory_state()]-open" in icon_states(icon))) + to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) + return TRUE + open = !open + to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) + if(open && held) + to_chat(user, SPAN_DANGER("\The [held] falls out!")) + held.dropInto(user.loc) + held = null + update_icon() + return TRUE + +/obj/item/pendant/locket/on_update_icon() + . = ..() + icon_state = get_pendant_base_state(get_world_inventory_state()) + if(istype(loc, /obj/item)) + loc.update_icon() + +/obj/item/pendant/locket/get_pendant_base_state(base_state) + . = ..() + if(open) + . = "[.]-open" + +/obj/item/pendant/locket/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && open) + var/pendant_state = get_pendant_base_state(overlay.icon_state) + if(check_state_in_icon(pendant_state, overlay.icon)) + overlay.icon_state = pendant_state + return ..() + +/obj/item/pendant/locket/attackby(obj/item/used_item, mob/user) + if(!open) + to_chat(user, SPAN_WARNING("You have to open it first.")) + return TRUE + if(istype(used_item, /obj/item/paper) || istype(used_item, /obj/item/photo)) + if(held) + to_chat(user, SPAN_WARNING("\The [src] already has something inside it.")) + else if(user.try_unequip(used_item, src)) + to_chat(user, SPAN_NOTICE("You slip \the [used_item] into \the [src].")) + held = used_item + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/clothing/neck/necklace/pendant_random.dm b/code/modules/clothing/neck/necklace/pendant_random.dm new file mode 100644 index 000000000000..f17171032c6e --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_random.dm @@ -0,0 +1,27 @@ +/obj/item/pendant/prism/random/Initialize(ml, material_key) + material_key = list(global.random_jewellery_gem_types) + . = ..() + +/obj/item/pendant/frill/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/square/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/cross/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/diamond/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/ornate/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() diff --git a/code/modules/clothing/neck/necklace/pendant_setting.dm b/code/modules/clothing/neck/necklace/pendant_setting.dm new file mode 100644 index 000000000000..80e79b13cf2a --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_setting.dm @@ -0,0 +1,36 @@ +// Pendant with a setting for a stone. +/obj/item/pendant/setting + abstract_type = /obj/item/pendant/setting + +// Duplicating some logic here to consistently insert the gem name where appropriate. +/obj/item/pendant/setting/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + var/obj/item/gemstone/gem = locate() in contents + if(gem) + . += gem.name + . += name // base_name has already been applied by parent call + +// Subtypes below. +/obj/item/pendant/setting/square + name_prefix = "square" + desc = "A square-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + +/obj/item/pendant/setting/cross + name = "cross" + desc = "A hard-edged cross pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/cross.dmi' + +/obj/item/pendant/setting/diamond + name_prefix = "diamond" + desc = "A diamond-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/diamond.dmi' + +/obj/item/pendant/setting/ornate + name_prefix = "ornate" + desc = "An ornate set of pendants." + icon = 'icons/clothing/accessories/jewelry/pendants/ornate.dmi' diff --git a/code/modules/clothing/neck/prayer_beads.dm b/code/modules/clothing/neck/prayer_beads.dm new file mode 100644 index 000000000000..0c081e351089 --- /dev/null +++ b/code/modules/clothing/neck/prayer_beads.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/neck/prayer_beads + name = "prayer beads" + desc = "A string of smooth, polished beads." + icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' + gender = PLURAL + material = /decl/material/solid/organic/wood/ebony + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/neck/prayer_beads/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/neck/prayer_beads/basalt + material = /decl/material/solid/stone/basalt + +/obj/item/clothing/neck/prayer_beads/bone + material = /decl/material/solid/organic/bone + +/obj/item/clothing/neck/prayer_beads/random + var/list/random_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + +/obj/item/clothing/neck/prayer_beads/random/Initialize() + material = pick(random_materials) + return ..() diff --git a/code/modules/clothing/pants/_pants.dm b/code/modules/clothing/pants/_pants.dm index f0fd128a5fc0..89f3e1c5b43b 100644 --- a/code/modules/clothing/pants/_pants.dm +++ b/code/modules/clothing/pants/_pants.dm @@ -9,8 +9,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/pants/get_associated_equipment_slots() - . = ..() - var/static/list/pants_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., pants_slots) diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm index ff3eeb08056d..7b841100fd48 100644 --- a/code/modules/clothing/shirts/_shirts.dm +++ b/code/modules/clothing/shirts/_shirts.dm @@ -5,8 +5,3 @@ slot_flags = SLOT_UPPER_BODY accessory_slot = ACCESSORY_SLOT_DECOR fallback_slot = slot_w_uniform_str - -/obj/item/clothing/shirt/get_associated_equipment_slots() - . = ..() - var/static/list/shirt_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., shirt_slots) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index aa9b8d82291c..6aedbb3edaf6 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -162,10 +162,6 @@ attached_cuffs = null return -/obj/item/clothing/shoes/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_shoes_str) - /obj/item/clothing/shoes/set_material(var/new_material) ..() if(shine != -1 && material.reflectiveness >= MAT_VALUE_DULL) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 9466eb0709aa..53579e0dd79a 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -84,7 +84,6 @@ icon = 'icons/clothing/feet/sandals.dmi' bodytype_equip_flags = null body_parts_covered = 0 - wizard_garb = 1 can_add_hidden_item = FALSE can_add_cuffs = FALSE diff --git a/code/modules/clothing/skirts/_skirt.dm b/code/modules/clothing/skirts/_skirt.dm index 4ec2f85f32d2..893909ee3648 100644 --- a/code/modules/clothing/skirts/_skirt.dm +++ b/code/modules/clothing/skirts/_skirt.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/skirt/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b3d1533d3b63..7626ac00c32e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -368,7 +368,7 @@ deactivate_string = "Deactivate Thrusters" interface_name = "maneuvering jets" - interface_desc = "An inbuilt EVA maneuvering system that runs off a seperate gas supply." + interface_desc = "An inbuilt EVA maneuvering system that runs off a separate gas supply." origin_tech = @'{"materials":6,"engineering":7}' material = /decl/material/solid/metal/steel matter = list( diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm deleted file mode 100644 index 48dfc6d852a3..000000000000 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ /dev/null @@ -1,66 +0,0 @@ -//Wizard Rig -/obj/item/clothing/head/helmet/space/void/wizard - name = "gem-encrusted voidsuit helmet" - desc = "A bizarre gem-encrusted helmet that radiates magical energies." - icon = 'icons/clothing/spacesuit/void/wizard/helmet.dmi' - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - -/obj/item/clothing/suit/space/void/wizard - name = "gem-encrusted voidsuit" - desc = "A bizarre gem-encrusted suit that radiates magical energies." - icon = 'icons/clothing/spacesuit/void/wizard/suit.dmi' - w_class = ITEM_SIZE_LARGE //normally voidsuits are bulky but this one is magic I suppose - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDETAIL //For gloves. - body_parts_covered = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - cold_protection = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - -/obj/item/clothing/suit/space/void/wizard/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_wear_suit_str, 1) - -/obj/item/clothing/gloves/wizard - name = "mystical gloves" - desc = "Reinforced, gem-studded gloves that radiate energy. They look like they go along with a matching voidsuit." - color = COLOR_VIOLET - item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HANDS - cold_protection = SLOT_HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE - bodytype_equip_flags = null - gender = PLURAL - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.02 - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 diff --git a/code/modules/clothing/suits/_suit.dm b/code/modules/clothing/suits/_suit.dm index f256b84311f8..7b4809a3b42d 100644 --- a/code/modules/clothing/suits/_suit.dm +++ b/code/modules/clothing/suits/_suit.dm @@ -16,10 +16,6 @@ /obj/item/clothing/suit/gives_weather_protection() return protects_against_weather -/obj/item/clothing/suit/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_suit_str) - /obj/item/clothing/suit/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return TRUE diff --git a/code/modules/clothing/suits/armor/_armor.dm b/code/modules/clothing/suits/armor/_armor.dm index d7fcd4281c27..250c133ae7be 100644 --- a/code/modules/clothing/suits/armor/_armor.dm +++ b/code/modules/clothing/suits/armor/_armor.dm @@ -11,7 +11,14 @@ /obj/item/baton, /obj/item/handcuffs, /obj/item/gun/magnetic, - /obj/item/clothing/head/helmet + /obj/item/clothing/head/helmet, + /obj/item/shield/buckler, + /obj/item/bladed/knife, + /obj/item/bladed/shortsword, + /obj/item/bladed/longsword, + /obj/item/bladed/axe, + /obj/item/flame/torch, + /obj/item/flame/fuelled/lantern ) body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY item_flags = ITEM_FLAG_THICKMATERIAL diff --git a/code/modules/clothing/suits/armor/forged/brigandine.dm b/code/modules/clothing/suits/armor/forged/brigandine.dm index 98583fb6b033..f790258a9628 100644 --- a/code/modules/clothing/suits/armor/forged/brigandine.dm +++ b/code/modules/clothing/suits/armor/forged/brigandine.dm @@ -10,3 +10,4 @@ name = "gambeson" desc = "A quilted, padded jacket, typically worn underneath heavier armour." icon = 'icons/clothing/shirts/gambeson.dmi' + material = /decl/material/solid/organic/cloth/wool diff --git a/code/modules/clothing/suits/hooded_cloak.dm b/code/modules/clothing/suits/hooded_cloak.dm index 24964e2f77ac..36018720bb63 100644 --- a/code/modules/clothing/suits/hooded_cloak.dm +++ b/code/modules/clothing/suits/hooded_cloak.dm @@ -8,11 +8,12 @@ w_class = ITEM_SIZE_NORMAL slot_flags = SLOT_OVER_BODY allowed = list(/obj/item/tank/emergency/oxygen) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS|SLOT_HANDS|SLOT_FEET accessory_slot = ACCESSORY_SLOT_OVER accessory_visibility = ACCESSORY_VISIBILITY_ATTACHMENT hood = /obj/item/clothing/head/hood/cloak material_alteration = MAT_FLAG_ALTERATION_ALL + material = /decl/material/solid/organic/cloth/wool /obj/item/clothing/suit/hooded_cloak/get_assumed_clothing_state_modifiers() var/static/list/expected_state_modifiers = list( diff --git a/code/modules/clothing/suits/mantle.dm b/code/modules/clothing/suits/mantle.dm index 6d7888cfebb7..94824410806a 100644 --- a/code/modules/clothing/suits/mantle.dm +++ b/code/modules/clothing/suits/mantle.dm @@ -1,7 +1,8 @@ /obj/item/clothing/suit/mantle - name = "mantle" - desc = "A light garment worn draped over and around the shoulders." - icon = 'icons/clothing/suits/mantle.dmi' + name = "mantle" + desc = "A garment worn draped over and around the shoulders." + icon = 'icons/clothing/suits/mantle.dmi' + material = /decl/material/solid/organic/cloth/wool accessory_slot = ACCESSORY_SLOT_OVER /obj/item/clothing/suit/mantle/fated diff --git a/code/modules/clothing/suits/misc.dm b/code/modules/clothing/suits/misc.dm new file mode 100644 index 000000000000..eb58d81b67eb --- /dev/null +++ b/code/modules/clothing/suits/misc.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/suit/gentlecoat + name = "gentleman's coat" + desc = "A heavy-threaded gray tweed jacket." + icon = 'icons/clothing/suits/wizard/gentleman.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS diff --git a/code/modules/clothing/suits/robes.dm b/code/modules/clothing/suits/robes.dm index 4ffdbf004b71..eabd216c555a 100644 --- a/code/modules/clothing/suits/robes.dm +++ b/code/modules/clothing/suits/robes.dm @@ -3,11 +3,18 @@ desc = "A simple garment." icon = 'icons/clothing/suits/rough_robe.dmi' gender = PLURAL + cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC slot_flags = SLOT_UPPER_BODY | SLOT_OVER_BODY accessory_slot = ACCESSORY_SLOT_DECOR +/obj/item/clothing/suit/robe/sleeved + desc = "A simple garment with long sleeves." + cold_protection = SLOT_ARMS|SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + body_parts_covered = SLOT_ARMS|SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + icon = 'icons/clothing/suits/sleeved_robe.dmi' + /obj/item/clothing/suit/robe/thawb name = "thawb" gender = NEUTER diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm deleted file mode 100644 index 16dd6386ebb9..000000000000 --- a/code/modules/clothing/suits/wiz_robe.dm +++ /dev/null @@ -1,113 +0,0 @@ -/obj/item/clothing/head/wizard - name = "wizard hat" - desc = "Strange-looking hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/wizard.dmi' - //Not given any special protective value since the magic robes are full-body protection --NEO - siemens_coefficient = 0.8 - body_parts_covered = 0 - wizard_garb = 1 - -/obj/item/clothing/head/wizard/red - name = "red wizard hat" - desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/red.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/fake - name = "wizard hat" - desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." - icon = 'icons/clothing/head/wizard/fake.dmi' - body_parts_covered = SLOT_HEAD|SLOT_FACE - -/obj/item/clothing/head/wizard/marisa - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - icon = 'icons/clothing/head/wizard/marisa.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/magus - name = "magus helm" - desc = "A mysterious helmet that hums with an unearthly power." - icon = 'icons/clothing/head/wizard/magus.dmi' - siemens_coefficient = 0.8 - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES - -/obj/item/clothing/head/wizard/cap - name = "gentleman's cap" - desc = "A checkered gray flat cap woven together with the rarest of threads." - icon = 'icons/clothing/head/flatcap.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/suit/wizrobe - name = "wizard robe" - desc = "A magnificant, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/wizard.dmi' - gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE - permeability_coefficient = 0.01 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR, - ARMOR_RAD = ARMOR_RAD_MINOR - ) - allowed = list(/obj/item/paper/scroll) - siemens_coefficient = 0.8 - wizard_garb = 1 - -/obj/item/clothing/suit/wizrobe/red - name = "red wizard robe" - desc = "A magnificant, red, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/red.dmi' - -/obj/item/clothing/suit/wizrobe/marisa - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - icon = 'icons/clothing/suits/wizard/marisa.dmi' - -/obj/item/clothing/suit/wizrobe/magusblue - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusblue.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/magusred - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusred.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/psypurple - name = "purple robes" - desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." - icon = 'icons/clothing/suits/wizard/psy.dmi' - gender = PLURAL - -/obj/item/clothing/suit/wizrobe/gentlecoat - name = "gentleman's coat" - desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman." - icon = 'icons/clothing/suits/wizard/gentleman.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/suit/wizrobe/fake - name = "wizard robe" - desc = "A rather dull, blue robe meant to mimick real wizard robes." - icon = 'icons/clothing/suits/wizard/fake.dmi' - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/head/wizard/marisa/fake - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/suit/wizrobe/marisa/fake - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - armor = null - siemens_coefficient = 1.0 - diff --git a/code/modules/clothing/suits/wizard.dm b/code/modules/clothing/suits/wizard.dm new file mode 100644 index 000000000000..c8f0208fb4d5 --- /dev/null +++ b/code/modules/clothing/suits/wizard.dm @@ -0,0 +1,25 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/suit/wizrobe + name = "wizard robe" + desc = "A rather ratty blue robe." + icon = 'icons/clothing/suits/wizard/wizard.dmi' + allowed = list(/obj/item/paper/scroll) + +/obj/item/clothing/suit/wizrobe/red + name = "red wizard robe" + desc = "A rather ratty red robe." + icon = 'icons/clothing/suits/wizard/red.dmi' + +/obj/item/clothing/suit/wizrobe/marisa + name = "witch robe" + desc = "Magic is all about the spell power, ZE!" + icon = 'icons/clothing/suits/wizard/marisa.dmi' + +/obj/item/clothing/suit/wizrobe/magus + name = "magus robe" + desc = "A set of mysterious armoured robes." + icon = 'icons/clothing/suits/wizard/magusblue.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET + +/obj/item/clothing/suit/wizrobe/magus/red + icon = 'icons/clothing/suits/wizard/magusred.dmi' diff --git a/code/modules/codex/codex_implant.dm b/code/modules/codex/codex_implant.dm index 6918ebd175ac..48d57b472edc 100644 --- a/code/modules/codex/codex_implant.dm +++ b/code/modules/codex/codex_implant.dm @@ -8,4 +8,4 @@ /obj/item/implant/codex/implanted(var/mob/source) . = ..(source) - to_chat(usr, "You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.") + to_chat(imp_in, SPAN_NOTICE("You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.")) diff --git a/code/modules/codex/entries/atmospherics.dm b/code/modules/codex/entries/atmospherics.dm index ccc05138738d..5b0b67fb8fbf 100644 --- a/code/modules/codex/entries/atmospherics.dm +++ b/code/modules/codex/entries/atmospherics.dm @@ -19,7 +19,7 @@ //Normal valves /datum/codex_entry/atmos_valve associated_paths = list(/obj/machinery/atmospherics/valve) - mechanics_text = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." + mechanics_text = "Click this to turn the valve. If red, the pipes on each end are separated. Otherwise, they are connected." disambiguator = "atmospherics" available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/crafting/handmade_fancy.dm b/code/modules/crafting/handmade_fancy.dm new file mode 100644 index 000000000000..9622296a587c --- /dev/null +++ b/code/modules/crafting/handmade_fancy.dm @@ -0,0 +1,58 @@ +/obj/item/chems/glass/handmade/fancy + abstract_type = /obj/item/chems/glass/handmade/fancy + material = /decl/material/solid/metal/silver + +/obj/item/chems/glass/handmade/fancy/get_single_monetary_worth() + . = ..() * 1.5 // Crafting value, todo proper crafting skill modifying sale price. + +/obj/item/chems/glass/handmade/fancy/decanter + name = "decanter" + desc = "A masterfully made decanter with a fluted neck and graceful handle." + icon = 'icons/obj/items/handmade/decanter.dmi' + amount_per_transfer_from_this = 10 + volume = 120 + obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE + +/obj/item/chems/glass/handmade/fancy/goblet + name = "goblet" + desc = "An elegant goblet with a flared base, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/cup_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/bowl + name = "bowl" + desc = "A sleek, polished bowl, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/bowl_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/vase + name = "vase" + desc = "An elegant masterwork vase." + icon = 'icons/obj/items/handmade/vase_fancy.dmi' + amount_per_transfer_from_this = 20 + volume = 240 + material = /decl/material/solid/stone/ceramic + +/obj/item/chems/glass/handmade/fancy/vase/fluted + desc = "An elegant masterwork vase with a fluted neck." + icon = 'icons/obj/items/handmade/vase_fancy_fluted.dmi' + +/obj/item/chems/glass/handmade/fancy/vase/fluted/update_name() + . = ..() + SetName("fluted [name]") + +// Decorated subtypes for mapping/ +/obj/item/chems/glass/handmade/fancy/vase/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/vase/fluted/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/goblet/mapped + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/octagon/ruby) + +/obj/item/chems/glass/handmade/fancy/bowl/mapped + decorations = list(/obj/item/gemstone/octagon/sapphire) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index 4c294d38b78d..5aa1ed2f1cae 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -12,7 +12,7 @@ /obj/item/chems/glass/handmade/teapot name = "teapot" desc = "A handmade, slightly lumpy teapot." - icon = 'icons/obj/pottery/teapot.dmi' + icon = 'icons/obj/items/handmade/teapot.dmi' amount_per_transfer_from_this = 10 volume = 120 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -20,14 +20,14 @@ /obj/item/chems/glass/handmade/cup name = "cup" desc = "A handmade, slightly lumpy cup." - icon = 'icons/obj/pottery/cup.dmi' + icon = 'icons/obj/items/handmade/cup.dmi' amount_per_transfer_from_this = 10 volume = 30 /obj/item/chems/glass/handmade/mug name = "mug" desc = "A handmade, slightly lumpy mug." - icon = 'icons/obj/pottery/mug.dmi' + icon = 'icons/obj/items/handmade/mug.dmi' amount_per_transfer_from_this = 10 volume = 60 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -35,36 +35,36 @@ /obj/item/chems/glass/handmade/vase name = "vase" desc = "A handmade, slightly lumpy vase." - icon = 'icons/obj/pottery/vase.dmi' + icon = 'icons/obj/items/handmade/vase.dmi' amount_per_transfer_from_this = 20 volume = 240 /obj/item/chems/glass/handmade/jar name = "jar" desc = "A handmade, slightly lumpy jar." - icon = 'icons/obj/pottery/jar.dmi' + icon = 'icons/obj/items/handmade/jar.dmi' amount_per_transfer_from_this = 10 volume = 60 /obj/item/chems/glass/handmade/bottle name = "bottle" desc = "A handmade, slightly lumpy bottle." - icon = 'icons/obj/pottery/bottle.dmi' + icon = 'icons/obj/items/handmade/bottle.dmi' amount_per_transfer_from_this = 10 volume = 120 /obj/item/chems/glass/handmade/bottle/tall name = "tall bottle" - icon = 'icons/obj/pottery/bottle_tall.dmi' + icon = 'icons/obj/items/handmade/bottle_tall.dmi' /obj/item/chems/glass/handmade/bottle/wide name = "wide bottle" - icon = 'icons/obj/pottery/bottle_wide.dmi' + icon = 'icons/obj/items/handmade/bottle_wide.dmi' /obj/item/chems/glass/handmade/bowl name = "bowl" desc = "A handmade, slightly lumpy bowl." - icon = 'icons/obj/pottery/bowl.dmi' + icon = 'icons/obj/items/handmade/bowl.dmi' amount_per_transfer_from_this = 10 volume = 60 @@ -77,7 +77,6 @@ /obj/item/chems/glass/handmade/bowl/wood material = /decl/material/solid/organic/wood/oak - /obj/item/chems/glass/handmade/bottle/beer/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) diff --git a/code/modules/crafting/pottery/pottery_structures.dm b/code/modules/crafting/pottery/pottery_structures.dm index 34f021019fa0..2c9a369296b4 100644 --- a/code/modules/crafting/pottery/pottery_structures.dm +++ b/code/modules/crafting/pottery/pottery_structures.dm @@ -63,5 +63,5 @@ /decl/interaction_handler/open_firebox/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/fire_source/kiln/kiln = target kiln.firebox_open = !kiln.firebox_open - to_chat(usr, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) + to_chat(user, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) kiln.update_icon() diff --git a/code/modules/crafting/slapcrafting/_crafting_holder.dm b/code/modules/crafting/slapcrafting/_crafting_holder.dm index 5a2ef1097792..b89a73d69a18 100644 --- a/code/modules/crafting/slapcrafting/_crafting_holder.dm +++ b/code/modules/crafting/slapcrafting/_crafting_holder.dm @@ -13,17 +13,13 @@ var/list/next_products = list() for(var/decl/crafting_stage/next_stage in current_crafting_stage.next_stages) if(ispath(next_stage.completion_trigger_type)) - var/atom/next_tool = next_stage.completion_trigger_type - var/tool_string = initial(next_tool.name) - if(next_stage.stack_consume_amount > 1) - tool_string = "[next_stage.stack_consume_amount] [tool_string]\s" - else - tool_string = "\a [tool_string]" + var/tool_string = next_stage.generate_completion_string() if(ispath(next_stage.product)) var/atom/next_product = next_stage.product next_products[tool_string] = "\a [initial(next_product.name)]" else next_steps += tool_string + if(length(next_products)) for(var/thing in next_products) to_chat(user, SPAN_NOTICE("With [thing], you could finish building [next_products[thing]].")) @@ -31,14 +27,27 @@ to_chat(user, SPAN_NOTICE("You could continue to work on this with [english_list(next_steps, and_text = " or ")].")) /obj/item/crafting_holder/Initialize(var/ml, var/decl/crafting_stage/initial_stage, var/obj/item/target, var/obj/item/tool, var/mob/user) + . = ..(ml) if(!initial_stage) return INITIALIZE_HINT_QDEL + name = "[target.name] assembly" - var/mob/M = target.loc - if(istype(M)) + + // Move our component into the new holder. + if(ismob(target.loc)) + var/mob/M = target.loc M.drop_from_inventory(target) - target.forceMove(src) + target.forceMove(src) + else if(ismovable(target.loc)) + var/atom/movable/holder = target.loc + if(holder.storage) + holder.storage.remove_from_storage(user, target, src) + else + target.forceMove(src) + else + target.forceMove(src) + current_crafting_stage = initial_stage update_icon() update_strings() @@ -78,9 +87,18 @@ if(ismob(product) && label_name) var/mob/M = product M.SetName(label_name) - if(ismob(src.loc)) - var/mob/M = src.loc + + if(ismob(loc)) + var/mob/M = loc M.drop_from_inventory(src) + else if(ismovable(loc)) + var/atom/movable/holder = loc + if(holder.storage) + holder.storage.remove_from_storage(user, src, get_turf(src)) + else + forceMove(get_turf(src)) + else + forceMove(get_turf(src)) qdel_self() else current_crafting_stage = next_stage diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index 23275abf92b0..b72c4d4cb8e2 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -20,6 +20,28 @@ stages += GET_DECL(nid) next_stages = stages +/decl/crafting_stage/proc/generate_completion_string() + var/list/names = assemble_name_strings() + if(ispath(completion_trigger_type, /obj/item/stack) || stack_consume_amount) + names.Insert(1, max(stack_consume_amount, 1)) + return jointext(names, " ") + +/decl/crafting_stage/proc/assemble_name_strings() + SHOULD_CALL_PARENT(TRUE) + var/list/names = list() + var/obj/item/prop = completion_trigger_type + if(ispath(prop, /obj/item/stack)) + var/obj/item/stack/stack = prop + if(stack_consume_amount == 1) + names += stack::singular_name + else + names += stack::plural_name + else if(stack_consume_amount > 1) + names += "[prop::name]\s" + else + names += prop::name + return names + /decl/crafting_stage/proc/is_available() return global.using_map.map_tech_level >= available_to_map_tech_level @@ -89,6 +111,14 @@ consume_completion_trigger = FALSE var/stack_material = /decl/material/solid/metal/steel +/decl/crafting_stage/material/assemble_name_strings() + var/list/names = ..() + if(stack_material) + var/decl/material/mat = GET_DECL(stack_material) + if(mat) + names.Insert(1, mat.solid_name) + return names + /decl/crafting_stage/material/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) var/obj/item/stack/material/M = thing . = istype(M) && (!stack_material || M.material.type == stack_material) && ..() diff --git a/code/modules/crafting/stack_recipes/recipes_bricks.dm b/code/modules/crafting/stack_recipes/recipes_bricks.dm index 1901075e8e0d..ec8bf11e3b3b 100644 --- a/code/modules/crafting/stack_recipes/recipes_bricks.dm +++ b/code/modules/crafting/stack_recipes/recipes_bricks.dm @@ -71,6 +71,19 @@ name = "pillar, round" result_type = /obj/structure/pillar/round +/decl/stack_recipe/bricks/furniture/pillar/wide_round + name = "pillar, wide round" + result_type = /obj/structure/pillar/wide + +/decl/stack_recipe/bricks/furniture/pillar/wide_square + name = "pillar, wide square" + + result_type = /obj/structure/pillar/wide/square + +/decl/stack_recipe/bricks/furniture/pillar/wide_inset + name = "pillar, wide inset" + result_type = /obj/structure/pillar/wide/inset + /decl/stack_recipe/bricks/furniture/pillar/pedestal name = "pedestal, square" result_type = /obj/structure/pedestal diff --git a/code/modules/crafting/stack_recipes/recipes_fodder.dm b/code/modules/crafting/stack_recipes/recipes_fodder.dm new file mode 100644 index 000000000000..86ec028b152d --- /dev/null +++ b/code/modules/crafting/stack_recipes/recipes_fodder.dm @@ -0,0 +1,14 @@ +/decl/stack_recipe/fodder + result_type = /obj/structure/haystack + required_material = /decl/material/solid/organic/plantmatter/grass/dry + craft_stack_types = list(/obj/item/stack/material/bundle) + one_per_turf = TRUE + on_floor = TRUE + difficulty = MAT_VALUE_EASY_DIY + recipe_skill = SKILL_BOTANY + +/decl/stack_recipe/fodder/get_required_stack_amount(obj/item/stack/stack) + return 30 // Arbitrary amount to make 20 food items. + +/decl/stack_recipe/fodder/bale + result_type = /obj/structure/haystack/bale diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc2..badba30d8a47 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -8,9 +8,18 @@ return FALSE return ..() +/decl/stack_recipe/woven/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/woven/basket result_type = /obj/item/basket +/decl/stack_recipe/woven/large_basket + result_type = /obj/item/basket/large + /decl/stack_recipe/woven/banner result_type = /obj/item/banner/woven @@ -32,3 +41,6 @@ /obj/item/stack/material/bundle, /obj/item/stack/material/thread ) + +/decl/stack_recipe/woven/dummy + result_type = /obj/item/training_dummy/straw diff --git a/code/modules/crafting/stack_recipes/recipes_hardness.dm b/code/modules/crafting/stack_recipes/recipes_hardness.dm index a656ebc868e0..903769244d6e 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness.dm @@ -75,7 +75,19 @@ result_type = /obj/item/chems/glass/mortar /decl/stack_recipe/ring - result_type = /obj/item/clothing/gloves/ring/material + result_type = /obj/item/clothing/gloves/ring + +/decl/stack_recipe/ring_thin + name = "ring, thin" + result_type = /obj/item/clothing/gloves/ring/thin + +/decl/stack_recipe/ring_thick + name = "ring, thick" + result_type = /obj/item/clothing/gloves/ring/thick + +/decl/stack_recipe/ring_split + name = "ring, split" + result_type = /obj/item/clothing/gloves/ring/split /decl/stack_recipe/hardness/clipboard result_type = /obj/item/clipboard diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 85d95289351e..8b0781f7d432 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -89,6 +89,9 @@ /decl/stack_recipe/hardness/integrity/lock result_type = /obj/item/lock_construct +/decl/stack_recipe/hardness/integrity/lockpick + result_type = /obj/item/lockpick + /decl/stack_recipe/hardness/integrity/key result_type = /obj/item/key diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index f8a750754998..98d3254f5228 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -78,6 +78,26 @@ /decl/stack_recipe/planks/bowl result_type = /obj/item/chems/glass/handmade/bowl +/decl/stack_recipe/planks/fancy + abstract_type = /decl/stack_recipe/planks/fancy + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/planks/fancy/decanter + result_type = /obj/item/chems/glass/handmade/fancy/decanter + +/decl/stack_recipe/planks/fancy/goblet + result_type = /obj/item/chems/glass/handmade/fancy/goblet + +/decl/stack_recipe/planks/fancy/bowl + result_type = /obj/item/chems/glass/handmade/fancy/bowl + +/decl/stack_recipe/planks/fancy/vase + result_type = /obj/item/chems/glass/handmade/fancy/vase + +/decl/stack_recipe/planks/fancy/vase_fluted + name = "vase, fluted" + result_type = /obj/item/chems/glass/handmade/fancy/vase/fluted + /decl/stack_recipe/planks/noticeboard/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) . = ..() if(user) @@ -222,3 +242,15 @@ /decl/stack_recipe/planks/furniture/gravemarker result_type = /obj/item/gravemarker difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/planks/furniture/divider + result_type = /obj/structure/divider + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/planks/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/planks/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_struts.dm b/code/modules/crafting/stack_recipes/recipes_rods.dm similarity index 72% rename from code/modules/crafting/stack_recipes/recipes_struts.dm rename to code/modules/crafting/stack_recipes/recipes_rods.dm index fced999502f2..c010556a990d 100644 --- a/code/modules/crafting/stack_recipes/recipes_struts.dm +++ b/code/modules/crafting/stack_recipes/recipes_rods.dm @@ -1,6 +1,7 @@ -/decl/stack_recipe/strut - abstract_type = /decl/stack_recipe/strut +/decl/stack_recipe/rods + abstract_type = /decl/stack_recipe/rods craft_stack_types = list( + /obj/item/stack/material/rods, /obj/item/stack/material/strut, /obj/item/stack/material/bone ) @@ -10,64 +11,69 @@ available_to_map_tech_level = MAP_TECH_LEVEL_MEDIEVAL category = "structures" -/decl/stack_recipe/strut/stick +/decl/stack_recipe/rods/stick result_type = /obj/item/stick one_per_turf = FALSE on_floor = FALSE difficulty = MAT_VALUE_EASY_DIY category = "items" -/decl/stack_recipe/strut/stick/staff +/decl/stack_recipe/rods/stick/staff result_type = /obj/item/staff difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/stick/cane +/decl/stack_recipe/rods/stick/cane result_type = /obj/item/cane difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/railing +/decl/stack_recipe/rods/railing result_type = /obj/structure/railing -/decl/stack_recipe/strut/ladder +/decl/stack_recipe/rods/ladder result_type = /obj/structure/ladder on_floor = FALSE required_wall_support_value = 10 -/decl/stack_recipe/strut/girder +/decl/stack_recipe/rods/girder result_type = /obj/structure/girder required_wall_support_value = 10 req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since girders return weird matter values. available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/wall_frame +/decl/stack_recipe/rods/wall_frame result_type = /obj/structure/wall_frame available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/table_frame +/decl/stack_recipe/rods/table_frame result_type = /obj/structure/table/frame category = "furniture" -/decl/stack_recipe/strut/rack +/decl/stack_recipe/rods/rack result_type = /obj/structure/rack category = "furniture" -/decl/stack_recipe/strut/butcher_hook +/decl/stack_recipe/rods/butcher_hook result_type = /obj/structure/meat_hook one_per_turf = TRUE difficulty = MAT_VALUE_NORMAL_DIY category = "furniture" -/decl/stack_recipe/strut/bed +/decl/stack_recipe/rods/bed result_type = /obj/structure/bed required_integrity = 50 required_min_hardness = MAT_VALUE_FLEXIBLE + 10 category = "furniture" -/decl/stack_recipe/strut/machine +/decl/stack_recipe/rods/machine result_type = /obj/machinery/constructable_frame/machine_frame req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since machines don't handle matter properly yet. required_material = /decl/material/solid/metal/steel available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) +/decl/stack_recipe/rods/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) return ..(user, location, amount, null, null, paint_color, spent_type, spent_amount) + +/decl/stack_recipe/rods/grille + result_type = /obj/structure/grille + one_per_turf = TRUE + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_steel.dm b/code/modules/crafting/stack_recipes/recipes_steel.dm index 8f15300c3677..9befbe3d3f12 100644 --- a/code/modules/crafting/stack_recipes/recipes_steel.dm +++ b/code/modules/crafting/stack_recipes/recipes_steel.dm @@ -108,3 +108,11 @@ /decl/stack_recipe/steel/furniture/drill_brace result_type = /obj/structure/drill_brace + +/decl/stack_recipe/steel/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/steel/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index c43dffe7ce14..0097dc55b8c6 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -7,9 +7,15 @@ crafting_extra_cost_factor = 1.5 // measure twice, cut once; material is lost. todo: produce scraps? abstract_type = /decl/stack_recipe/textiles +/decl/stack_recipe/textiles/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/textiles/cloak - result_type = /obj/item/clothing/suit/cloak/hide - category = "clothing" + result_type = /obj/item/clothing/suit/cloak/hide + category = "clothing" /decl/stack_recipe/textiles/banner name = "banner" @@ -60,9 +66,9 @@ category = "clothing" /decl/stack_recipe/textiles/leather/bedroll - result_type = /obj/item/bedroll - difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. - category = "bedding" + result_type = /obj/item/bedroll + difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. + category = "bedding" /decl/stack_recipe/textiles/leather/shoes result_type = /obj/item/clothing/shoes/craftable @@ -81,6 +87,17 @@ crafting_extra_cost_factor = 1.1 // less material is lost because it's relatively simple difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. +/decl/stack_recipe/textiles/leather/sack + result_type = /obj/item/bag/sack + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack + result_type = /obj/item/backpack/crafted/backpack + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack/haversack + result_type = /obj/item/backpack/crafted + /decl/stack_recipe/textiles/leather/waterskin result_type = /obj/item/chems/waterskin/crafted required_material = /decl/material/solid/organic/leather diff --git a/code/modules/decoration/_decoration.dm b/code/modules/decoration/_decoration.dm new file mode 100644 index 000000000000..0228f99654b5 --- /dev/null +++ b/code/modules/decoration/_decoration.dm @@ -0,0 +1,104 @@ +// Should return a linear list of /decl/item_decoration types that can apply to the target items. +/proc/get_decoration_types_for(mob/user, obj/item/target_item, obj/item/used_item) + // TODO: consider caching this somewhere? + for(var/decl/item_decoration/decoration as anything in decls_repository.get_decls_of_subtype_unassociated(/decl/item_decoration)) + if(decoration in target_item.decorations) + continue + if(!decoration.can_apply_to(user, target_item, used_item)) + continue + LAZYADD(., decoration) + +// Decl types for decorations below. +/decl/item_decoration + abstract_type = /decl/item_decoration + /// A descriptive named used to select this decoration. + var/name + /// State used when searching item icon files for world/inventory/onmob states to draw. + var/icon_state_modifier + /// A list of types that this decoration can be applied to. Must contain at least one entry. + var/list/can_decorate_types + /// A list of types that can be used to apply this decoration. Must contain at least one entry. + var/list/can_decorate_with_types + /// String used to describe this action. + var/decoration_verb = "decorate" + /// String used to describe this action while underway. + var/decoration_action = "decorating" + /// What skill to use when applying this decoration. If null, defaults to the material. + var/work_skill + /// How long this work should take. + var/work_time = 10 SECONDS + /// Factor value supplied to do_skilled() + var/work_factor = 1 + /// Additional monetary worth for the item, as a percentage of the base item value (ie. 0.1 = +10%) + var/decoration_worth_factor = 0.1 + +/decl/item_decoration/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name" + if(!istext(icon_state_modifier)) + . += "null or invalid icon_state_modifier" + if(!length(can_decorate_types)) + . += "no types in can_decorate_types" + if(!length(can_decorate_with_types)) + . += "no types in can_decorate_with_types" + +/decl/item_decoration/proc/can_apply_to(mob/user, obj/item/thing, obj/item/decorating_with) + if(!istype(thing) || !is_type_in_list(thing, can_decorate_types)) + return FALSE + if(!istype(decorating_with) || !is_type_in_list(decorating_with, can_decorate_with_types)) + return FALSE + return TRUE + +/decl/item_decoration/proc/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/apply_to_item(mob/user, obj/item/thing, obj/item/decorating_with) + var/stack_use = 0 + if(istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + for(var/stack_type in can_decorate_with_types) + if(istype(stack, stack_type)) + stack_use = can_decorate_with_types[stack_type] + break + if(stack.get_amount() < stack_use) + to_chat(user, SPAN_WARNING("You need at least [stack_use] [stack_use == 1 ? stack.singular_name : stack.plural_name] to [decoration_verb] \the [thing].")) + return FALSE + show_work_start_message(user, thing, decorating_with) + if(work_time && work_skill) + if(!user.do_skilled(work_time, work_skill, thing, work_factor)) + return FALSE + if(!QDELETED(user) || QDELETED(thing) || QDELETED(decorating_with) || user.get_active_held_item() != decorating_with) + return FALSE + if(stack_use && istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + if(!stack.use(stack_use)) + return FALSE + else if(!user.try_unequip(decorating_with, thing, FALSE)) + return FALSE + show_work_end_message(user, thing, decorating_with) + return TRUE + +// This will need work down the track. Value will be added by the decorations +// in matter[] but the value of the labour isn't reflected. Needs thought. +/decl/item_decoration/proc/get_decoration_value(obj/item/thing, base_value) + return max(1, round(base_value * decoration_worth_factor)) + +/decl/item_decoration/proc/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + return FALSE + +/decl/item_decoration/proc/resolve_color(obj/item/thing) + var/list/decoration_data = LAZYACCESS(thing.decorations, src) + if(islist(decoration_data) && length(decoration_data)) + var/obj/item/decoration_object = decoration_data["object"] + if(istype(decoration_object) && decoration_object.paint_color) + return decoration_object.paint_color + var/decl/material/decoration_material = decoration_data["material"] + if(istype(decoration_material)) + return decoration_material.color + if(istype(decoration_object)) + return decoration_object.color + return COLOR_WHITE diff --git a/code/modules/decoration/decoration_inset.dm b/code/modules/decoration/decoration_inset.dm new file mode 100644 index 000000000000..9ca503ac8e6b --- /dev/null +++ b/code/modules/decoration/decoration_inset.dm @@ -0,0 +1,14 @@ +// Sort of a placeholder for future generalised decorations. +/decl/item_decoration/inset + name = "inlay material" + icon_state_modifier = "-inlay" + can_decorate_types = list( + /obj/item/chems/glass/handmade/fancy/vase + ) + can_decorate_with_types = list( + /obj/item/stack/material/plank = 1, + /obj/item/stack/material/bone = 1, + /obj/item/stack/material/ingot = 1, + /obj/item/stack/material/sheet = 1, + /obj/item/stack/material/brick = 1 + ) diff --git a/code/modules/decoration/decoration_item.dm b/code/modules/decoration/decoration_item.dm new file mode 100644 index 000000000000..ae628cf68bf5 --- /dev/null +++ b/code/modules/decoration/decoration_item.dm @@ -0,0 +1,103 @@ +/obj/item + /// Assoc list of decoration instances to metadata, ie. + /// decorations[GET_DECL(/decl/item_decoration/inset)] = list("color" = COLOR_RED, "material" = GET_DECL(/decl/material/foo)) + var/list/decorations + +/obj/item/proc/add_item_decoration(decl/item_decoration/decoration_type, decoration_color, decl/material/decoration_material, obj/item/associated_object) + LAZYINITLIST(decorations) + if(ispath(decoration_type)) + decoration_type = GET_DECL(decoration_type) + if(!istype(decoration_type)) + CRASH("Invalid decoration_type.") + . = list() + if(decoration_color) + // TODO: validate color? + .["color"] = decoration_color + if(decoration_material) + if(ispath(decoration_material)) + decoration_material = GET_DECL(decoration_material) + if(istype(decoration_material)) + .["material"] = decoration_material + if(!associated_object) // Object holds matter, no need to add it to parent. + var/decoration_matter_amount = MATTER_AMOUNT_TRACE * get_matter_amount_modifier() + if(decoration_material.type in matter) + matter[decoration_material.type] += decoration_matter_amount + else + LAZYSET(matter, decoration_material.type, decoration_matter_amount) + else + PRINT_STACK_TRACE("Invalid decoration_material.") + if(associated_object) + .["object"] = associated_object + decorations[decoration_type] = . + queue_icon_update() + update_name() + +/obj/item/proc/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + return default_icon || icon + +/obj/item/proc/get_decoration_overlays(decoration_state, decoration_icon, on_mob = FALSE) + for(var/decl/item_decoration/decoration as anything in decorations) + var/list/decoration_metadata = decorations[decoration] + if(!islist(decoration_metadata)) + continue + var/obj/item/decoration_object = decoration_metadata["object"] + if(decoration_object) + decoration_icon = get_decoration_icon(decoration_icon, decoration_object, on_mob) + if(!decoration_icon) + continue + decoration_state = "[decoration_state]-[decoration.icon_state_modifier]" + if(check_state_in_icon(decoration_state, decoration_icon)) + LAZYADD(., overlay_image(decoration_icon, decoration_state, decoration.resolve_color(src), RESET_COLOR|RESET_ALPHA)) + +/obj/item/attackby(obj/item/used_item, mob/user) + . = ..() + if(.) + return + + if(user.check_intent(I_FLAG_HELP)) + var/list/possible_decorations = get_decoration_types_for(user, src, used_item) + if(!length(possible_decorations)) + return FALSE + var/decl/item_decoration/decoration + if(length(possible_decorations) == 1) + decoration = possible_decorations[1] + else + decoration = input(user, "Which decoration would you like to apply?", "Item Decoration") as null|anything in possible_decorations + if(!decoration || QDELETED(src) || QDELETED(user) || QDELETED(used_item) || !CanPhysicallyInteract(user) || user.get_active_held_item() != used_item) + return TRUE + if(istype(decoration) && decoration.apply_to_item(user, src, used_item)) + add_item_decoration(decoration, used_item.paint_color, used_item.material, istype(used_item, /obj/item/stack) ? null : used_item) + return TRUE + + for(var/decl/item_decoration/decoration as anything in decorations) + if(decoration.attempt_removal(user, src, used_item)) + return TRUE + +/obj/item/get_single_monetary_worth() + . = ..() + var/base_value = . + for(var/decl/item_decoration/decoration as anything in decorations) + . += decoration.get_decoration_value(src, base_value) + +/obj/item/on_update_icon() + . = ..() + var/list/decoration_overlays = get_decoration_overlays(icon_state) + if(length(decoration_overlays)) + add_overlay(decoration_overlays) + +/obj/item/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay) + var/list/decoration_overlays = get_decoration_overlays(overlay.icon_state, overlay.icon, on_mob = TRUE) + if(length(decoration_overlays)) + overlay.overlays += decoration_overlays + return ..() + +// Except decorations from storage datums. +/obj/item/get_stored_inventory() + . = ..() + if(length(.) && length(decorations)) + for(var/decl/item_decoration/decoration in decorations) + var/list/decoration_data = decorations[decoration] + var/thing = decoration_data?["object"] + if(isitem(thing)) + . -= thing diff --git a/code/modules/decoration/decoration_setting.dm b/code/modules/decoration/decoration_setting.dm new file mode 100644 index 000000000000..352cb3bdc565 --- /dev/null +++ b/code/modules/decoration/decoration_setting.dm @@ -0,0 +1,30 @@ +/decl/item_decoration/setting + name = "set a gem" + icon_state_modifier = "setting" + can_decorate_types = list( + /obj/item/clothing/gloves/ring, + /obj/item/pendant/setting + ) + can_decorate_with_types = list( + /obj/item/gemstone + ) + +/decl/item_decoration/setting/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + if(IS_SCREWDRIVER(used_item)) + var/list/decoration_data = target_item.decorations[src] + var/obj/item/removing = decoration_data?["object"] + if(istype(removing)) + user.visible_message(SPAN_DANGER("\The [user] levers \the [removing] out of \the [target_item] with \the [used_item]!")) + removing.dropInto(user.loc) + user.put_in_hands(removing) + LAZYREMOVE(target_item.decorations, src) + target_item.update_icon() + target_item.update_name() + return TRUE + return FALSE + +/decl/item_decoration/setting/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins carefully setting \the [decorating_with] into \the [thing].")) + +/decl/item_decoration/setting/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes setting \the [decorating_with] into \the [thing].")) diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index 9ba28f8bb138..7a4dbb20ba6b 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -42,8 +42,8 @@ return res + ..() /obj/machinery/forensic/attackby(obj/item/W, mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return if(user?.check_intent(I_FLAG_HARM)) return ..() // bash, bash! @@ -111,7 +111,7 @@ /obj/machinery/forensic/handle_mouse_drop(atom/over, mob/user, params) if(user == over) - remove_sample(usr) + remove_sample(user) return TRUE . = ..() @@ -125,4 +125,4 @@ /decl/interaction_handler/forensics_remove_sample/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/forensic/F = target - F.remove_sample(usr) + F.remove_sample(user) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 1097f54f9bc5..3ed5186e6b89 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -13,8 +13,8 @@ material = /decl/material/solid/organic/cloth material_alteration = MAT_FLAG_ALTERATION_NAME - var/on_fire = 0 - var/burn_time = 20 //if the rag burns for too long it turns to ashes + VAR_PRIVATE/_on_fire = 0 + VAR_PRIVATE/burn_time = 20 //if the rag burns for too long it turns to ashes /obj/item/chems/glass/rag/Initialize() . = ..() @@ -28,20 +28,23 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd . = ..() +/obj/item/chems/glass/rag/is_on_fire() + return _on_fire + /obj/item/chems/glass/rag/attack_self(mob/user) - if(on_fire && user.try_unequip(src)) + if(is_on_fire() && user.try_unequip(src)) user.visible_message(SPAN_NOTICE("\The [user] stamps out [src]."), SPAN_NOTICE("You stamp out [src].")) - extinguish() + extinguish_fire() else remove_contents(user) /obj/item/chems/glass/rag/attackby(obj/item/W, mob/user) if(W.isflamesource()) - if(on_fire) + if(is_on_fire()) to_chat(user, SPAN_WARNING("\The [src] is already blazing merrily!")) return TRUE - ignite() - if(on_fire) + ignite_fire() + if(is_on_fire()) visible_message(SPAN_DANGER("\The [user] lights \the [src] with \the [W].")) else to_chat(user, SPAN_WARNING("You attempt to light \the [src] with \the [W], but it doesn't seem to be flammable.")) @@ -50,17 +53,17 @@ return ..() /obj/item/chems/glass/rag/update_name() - . = ..() - if(on_fire) - SetName("burning [name]") + if(is_on_fire()) + name_prefix = "burning" else if(reagents && reagents.total_volume) - SetName("damp [name]") + name_prefix = "damp" else - SetName("dry [name]") + name_prefix = "dry" + . = ..() /obj/item/chems/glass/rag/on_update_icon() . = ..() - icon_state = "rag[on_fire? "lit" : ""]" + icon_state = "rag[is_on_fire()? "lit" : ""]" var/obj/item/chems/drinks/bottle/B = loc if(istype(B)) B.update_icon() @@ -93,14 +96,14 @@ /obj/item/chems/glass/rag/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(on_fire) + if(is_on_fire()) user.visible_message( SPAN_DANGER("\The [user] hits \the [target] with \the [src]!"), SPAN_DANGER("You hit \the [target] with \the [src]!") ) user.do_attack_animation(target) admin_attack_log(user, target, "used \the [src] (ignited) to attack", "was attacked using \the [src] (ignited)", "attacked with \the [src] (ignited)") - target.IgniteMob() + target.ignite_fire() return TRUE if(reagents.total_volume) @@ -150,7 +153,7 @@ update_name() return - if(!on_fire && istype(A) && (src in user)) + if(!is_on_fire() && istype(A) && (src in user)) if(ATOM_IS_OPEN_CONTAINER(A) && !(A in user)) remove_contents(user, A) else if(!ismob(A)) //mobs are handled in use_on_mob() - this prevents us from wiping down people while smothering them. @@ -159,7 +162,7 @@ /obj/item/chems/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature >= 50 + T0C) - ignite() + ignite_fire() if(exposed_temperature >= 900 + T0C) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) @@ -168,7 +171,7 @@ //rag must have a minimum of 2 units welder fuel and at least 80% of the reagents must be welder fuel. //maybe generalize flammable reagents someday -/obj/item/chems/glass/rag/proc/can_ignite() +/obj/item/chems/glass/rag/can_ignite() var/total_fuel = 0 var/total_volume = 0 if(reagents) @@ -178,21 +181,21 @@ total_fuel += REAGENT_VOLUME(reagents, rtype) * R.accelerant_value . = (total_fuel >= 2 && total_fuel >= total_volume*0.5) -/obj/item/chems/glass/rag/proc/ignite() - if(on_fire) +/obj/item/chems/glass/rag/ignite_fire() + if(is_on_fire()) return if(!can_ignite()) return START_PROCESSING(SSobj, src) set_light(2, 1, "#e38f46") - on_fire = 1 + _on_fire = TRUE update_name() update_icon() -/obj/item/chems/glass/rag/proc/extinguish() +/obj/item/chems/glass/rag/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) set_light(0) - on_fire = 0 + _on_fire = FALSE //rags sitting around with 1 second of burn time left is dumb. //ensures players always have a few seconds of burn time left when they light their rag @@ -206,12 +209,11 @@ /obj/item/chems/glass/rag/Process() if(!can_ignite()) visible_message("\The [src] burns out.") - extinguish() + extinguish_fire() //copied from matches - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() + if(loc) + loc.ignite_fire() var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index fda0929fe7c4..2b0eec774a62 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -137,7 +137,7 @@ if(QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) return TRUE - var/amount = input(usr, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num + var/amount = input(user, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num amount = round(clamp(amount, 0, floor(get_worth() - 1))) if(!amount || QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) diff --git a/code/modules/error_handler/error_reporting.dm b/code/modules/error_handler/error_reporting.dm deleted file mode 100644 index 773920717cbd..000000000000 --- a/code/modules/error_handler/error_reporting.dm +++ /dev/null @@ -1,23 +0,0 @@ -// this proc will only work with DEBUG enabled -#ifdef DEBUG - -/hook/roundend/proc/send_runtimes_to_ircbot() - if(!revdata.revision) return // we can't do much useful if we don't know what we are - var/list/errors = list() - for(var/erruid in global.error_cache.error_sources) - var/datum/error_viewer/error_source/e = global.error_cache.error_sources[erruid] - var/datum/error_viewer/error_entry/err = e.errors[1] - - var/data = list( - id = erruid, - name = err.info_name, - info = err.info - ) - - errors[++errors.len] = list2params(data) - - runtimes2irc(list2params(errors), revdata.revision) - - return 1 - -#endif diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm deleted file mode 100644 index 9b1887f118fb..000000000000 --- a/code/modules/ext_scripts/irc.dm +++ /dev/null @@ -1,55 +0,0 @@ -/proc/send2irc(var/channel, var/msg) - export2irc(list(type="msg", mesg=msg, chan=channel, pwd=get_config_value(/decl/config/text/comms_password))) - -/proc/export2irc(params) - if(!get_config_value(/decl/config/toggle/use_irc_bot)) - return - var/irc_bot_host = get_config_value(/decl/config/text/irc_bot_host) - if(irc_bot_host) - spawn(-1) // spawn here prevents hanging in the case that the bot isn't reachable - world.Export("http://[irc_bot_host]:45678?[list2params(params)]") - -/proc/runtimes2irc(runtimes, revision) - export2irc(list(pwd=get_config_value(/decl/config/text/comms_password), type="runtime", runtimes=runtimes, revision=revision)) - -/proc/send2mainirc(var/msg) - var/main_irc = get_config_value(/decl/config/text/main_irc) - if(main_irc) - send2irc(main_irc, msg) - return - -/proc/send2adminirc(var/msg) - var/admin_irc = get_config_value(/decl/config/text/admin_irc) - if(admin_irc) - send2irc(admin_irc, msg) - return - -/proc/adminmsg2adminirc(client/source, client/target, msg) - var/admin_irc = get_config_value(/decl/config/text/admin_irc) - if(admin_irc) - var/list/params[0] - - params["pwd"] = get_config_value(/decl/config/text/comms_password) - params["chan"] = admin_irc - params["msg"] = msg - params["src_key"] = source.key - params["src_char"] = source.mob.real_name || source.mob.name - if(!target) - params["type"] = "adminhelp" - else if(istext(target)) - params["type"] = "ircpm" - params["target"] = target - params["rank"] = source.holder ? source.holder.rank : "Player" - else - params["type"] = "adminpm" - params["trg_key"] = target.key - params["trg_char"] = target.mob.real_name || target.mob.name - - export2irc(params) - -/proc/get_world_url() - return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" - -/hook/startup/proc/ircNotify() - send2mainirc("Server starting up on [get_world_url()]") - return 1 diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 64adcc09ac33..69b99bda0b9f 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -118,7 +118,7 @@ /datum/fabricator_recipe/struts name = "strut, steel" - path = /obj/item/stack/material/strut/mapped/steel + path = /obj/item/stack/material/rods/mapped/steel /datum/fabricator_recipe/struts/get_resources() resources = list( @@ -127,7 +127,7 @@ /datum/fabricator_recipe/struts/plastic name = "strut, plastic" - path = /obj/item/stack/material/strut/mapped/plastic + path = /obj/item/stack/material/rods/mapped/plastic /datum/fabricator_recipe/struts/plastic/get_resources() resources = list( @@ -136,7 +136,7 @@ /datum/fabricator_recipe/struts/aluminium name = "strut, aluminium" - path = /obj/item/stack/material/strut/mapped/aluminium + path = /obj/item/stack/material/rods/mapped/aluminium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/aluminium/get_resources() @@ -146,7 +146,7 @@ /datum/fabricator_recipe/struts/titanium name = "strut, titanium" - path = /obj/item/stack/material/strut/mapped/titanium + path = /obj/item/stack/material/rods/mapped/titanium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/titanium/get_resources() diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 2d5ac4cd4ee4..305322cb3d66 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -12,7 +12,7 @@ var/datum/mob_snapshot/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || ..() + . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || istype(thing?.material, /decl/material/solid/organic/meat) || ..() /obj/machinery/fabricator/bioprinter/get_nano_template() return "fabricator_bioprinter.tmpl" @@ -23,9 +23,6 @@ order.set_data("dna", loaded_dna) return order -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - return istype(thing?.material, /decl/material/solid/organic/meat) || ..() - /obj/machinery/fabricator/bioprinter/do_build(datum/fabricator_build_order/order) . = ..() //Fetch params as they were when the order was passed diff --git a/code/modules/fabrication/fabricator_books.dm b/code/modules/fabrication/fabricator_books.dm index e69f24ea5ce4..b5861f878581 100644 --- a/code/modules/fabrication/fabricator_books.dm +++ b/code/modules/fabrication/fabricator_books.dm @@ -10,6 +10,13 @@ fabricator_class = FABRICATOR_CLASS_BOOKS color_selectable = TRUE +/obj/machinery/fabricator/book/can_ingest(obj/item/thing) + var/static/list/paper_types = list( + /obj/item/paper, + /obj/item/shreddedp + ) + . = is_type_in_list(thing, paper_types) || ..() + /obj/machinery/fabricator/book/make_order(datum/fabricator_recipe/recipe, multiplier) var/datum/fabricator_build_order/order = ..() LAZYSET(order.data, "selected_color", selected_color) diff --git a/code/modules/fabrication/fabricator_food.dm b/code/modules/fabrication/fabricator_food.dm index ed677a64e9ae..cf6486e37019 100644 --- a/code/modules/fabrication/fabricator_food.dm +++ b/code/modules/fabrication/fabricator_food.dm @@ -33,7 +33,7 @@ break ..() -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) +/obj/machinery/fabricator/replicator/can_ingest(var/obj/item/thing) return istype(thing, /obj/item/food) || ..() /obj/machinery/fabricator/replicator/proc/state_status() diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 33c516ba6beb..433bd25913ba 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -92,8 +92,8 @@ to_chat(user, SPAN_WARNING("\The [src] cannot process \the [thing].")) /obj/machinery/fabricator/attackby(var/obj/item/O, var/mob/user) - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(panel_open && (IS_MULTITOOL(O) || IS_WIRECUTTER(O))) attack_hand_with_interaction_checks(user) return TRUE @@ -115,10 +115,10 @@ if(istype(O, /obj/item/disk/design_disk)) var/obj/item/disk/design_disk/disk = O if(!disk.blueprint) - to_chat(usr, SPAN_WARNING("\The [O] is blank.")) + to_chat(user, SPAN_WARNING("\The [O] is blank.")) return TRUE if(disk.blueprint in installed_designs) - to_chat(usr, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) + to_chat(user, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) return TRUE installed_designs += disk.blueprint design_cache |= disk.blueprint diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index 93c6a4585eb3..9465db82d300 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -40,3 +40,16 @@ if(. == PROCESS_KILL) last_boil_temp = null + +/obj/item/chems/cooking_vessel/cauldron + name = "cauldron" + desc = "A large round-bodied vessel for making large quantities of potion or soup." + material = /decl/material/solid/metal/iron + color = /decl/material/solid/metal/iron::color + icon = 'icons/obj/food/cooking_vessels/cauldron.dmi' + volume = 1000 + w_class = ITEM_SIZE_STRUCTURE + density = TRUE + +/obj/item/chems/cooking_vessel/cauldron/can_be_picked_up(mob/user) + return FALSE diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 6cd35f6b546f..5c7765027cb7 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -101,7 +101,7 @@ if(selected >= 0 && !isobserver(user)) dat += "
Remove Selected Piece" show_browser(user, jointext(dat, null), "window=boardgame;size=430x500") // 50px * 8 squares + 30 margin - onclose(usr, "boardgame") + onclose(user, "boardgame") /obj/item/board/Topic(href, href_list) if(!usr.Adjacent(src)) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 25d30addecd4..c4351b213e2b 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -208,7 +208,6 @@ var/global/list/card_decks = list() for(var/mob/living/player in viewers(3)) if(!player.stat) players += player - //players -= usr var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players if(!usr || !src || !M) return diff --git a/code/modules/gemstones/_gemstone.dm b/code/modules/gemstones/_gemstone.dm new file mode 100644 index 000000000000..d4e51499dd1f --- /dev/null +++ b/code/modules/gemstones/_gemstone.dm @@ -0,0 +1,127 @@ +var/global/list/_available_gemstone_cuts + +/proc/get_available_gemstone_cuts() + if(!global._available_gemstone_cuts) + global._available_gemstone_cuts = list() + for(var/decl/gemstone_cut/cut as anything in decls_repository.get_decls_of_type_unassociated(/decl/gemstone_cut)) + if(cut.can_be_cut) + global._available_gemstone_cuts += cut + return global._available_gemstone_cuts + +/obj/item/gemstone + name = "uncut gemstone" + desc = "A hunk of uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + w_class = ITEM_SIZE_TINY + material = /decl/material/solid/gemstone/diamond + material_alteration = MAT_FLAG_ALTERATION_COLOR // Name and desc are handled manually. + var/decl/gemstone_cut/cut = /decl/gemstone_cut/uncut + var/work_skill = SKILL_CONSTRUCTION + +/obj/item/gemstone/Initialize(ml, material_key) + cut = GET_DECL(cut) + . = ..() + update_from_cut() + +/obj/item/gemstone/proc/update_from_cut() + icon = cut.icon + desc = cut.desc + update_name() + update_icon() + +/obj/item/gemstone/update_name() + SetName("[cut.adjective] [material.solid_name]") + +/obj/item/gemstone/get_single_monetary_worth() + . = ..() * cut.worth_multiplier + +/obj/item/gemstone/attackby(obj/item/used_item, mob/user) + if(IS_HAMMER(used_item) && !user.check_intent(I_FLAG_HARM)) // TOOL_CHISEL when? + if(!cut.can_attempt_cut) + to_chat(user, SPAN_WARNING("\The [src] has already been cut.")) + return TRUE + var/decl/gemstone_cut/desired_cut = input(user, "What cut would you like to attempt?", "Cut Gemstone") as null|anything in get_available_gemstone_cuts() + if(!desired_cut || QDELETED(src) || QDELETED(user) || !CanPhysicallyInteract(user) || !cut.can_attempt_cut) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] begins carefully cutting \the [src].")) + if(!user.do_skilled(10 SECONDS, work_skill, src, check_holding = TRUE) || !CanPhysicallyInteract(user)) + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + to_chat(user, SPAN_DANGER("You were interrupted, botching the cut!")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] finishes cutting \the [src].")) + if(user.skill_fail_prob(work_skill, 100, SKILL_EXPERT)) + to_chat(user, SPAN_DANGER("You've done a really poor job...")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + cut = desired_cut + update_from_cut() + return TRUE + . = ..() + +// Subtypes for mapping/spawning etc. +/obj/item/gemstone/poor + name = "poorly-cut diamond" + cut = /decl/gemstone_cut/poor + icon = 'icons/obj/items/gemstones/poor.dmi' + +/obj/item/gemstone/baguette + name = "baguette-cut diamond" + cut = /decl/gemstone_cut/baguette + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/obj/item/gemstone/hexagon + name = "hexagon-cut diamond" + cut = /decl/gemstone_cut/hexagon + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/obj/item/gemstone/octagon + name = "octagon-cut diamond" + cut = /decl/gemstone_cut/octagon + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/obj/item/gemstone/round + name = "round-cut diamond" + cut = /decl/gemstone_cut/round + icon = 'icons/obj/items/gemstones/round.dmi' + + +// Material subtypes. +/obj/item/gemstone/baguette/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/baguette/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/baguette/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/hexagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/hexagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/hexagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/octagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/octagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/octagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/round/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/round/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/round/ruby + material = /decl/material/solid/gemstone/ruby diff --git a/code/modules/gemstones/gemstone_cuts.dm b/code/modules/gemstones/gemstone_cuts.dm new file mode 100644 index 000000000000..4b8b15fb7d84 --- /dev/null +++ b/code/modules/gemstones/gemstone_cuts.dm @@ -0,0 +1,76 @@ +/decl/gemstone_cut + abstract_type = /decl/gemstone_cut + var/worth_multiplier = 1.5 + var/name + var/desc + var/adjective + var/icon + // Can we cut this cut into a new cut? + var/can_attempt_cut = FALSE + // Can we attempt to cut to this cut? + var/can_be_cut = TRUE + +/decl/gemstone_cut/validate() + . = ..() + if(!istext(name)) + . += "invalid or null name" + if(!istext(desc)) + . += "invalid or null desc" + if(!istext(adjective)) + . += "invalid or null adjective" + if(icon) + if(!check_state_in_icon(ICON_STATE_WORLD, icon)) + . += "missing world state from '[icon]'" + if(!check_state_in_icon(ICON_STATE_INV, icon)) + . += "missing inventory state from '[icon]'" + var/decl/item_decoration/gem_set = GET_DECL(/decl/item_decoration/setting) + var/check_state = "[ICON_STATE_WORLD]-[gem_set.icon_state_modifier]" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + check_state = "[ICON_STATE_INV]-[gem_set.icon_state_modifier]" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + else + . += "null or unset icon" + +// Subtypes below. +/decl/gemstone_cut/uncut + name = "uncut" + adjective = "uncut" + desc = "A rough, uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + can_attempt_cut = TRUE + can_be_cut = FALSE + worth_multiplier = 1 + +/decl/gemstone_cut/poor + name = "poorly-cut" + adjective = "poorly-cut" + desc = "A poorly-cut and uneven gemstone." + icon = 'icons/obj/items/gemstones/poor.dmi' + worth_multiplier = 0.5 + can_be_cut = FALSE + +/decl/gemstone_cut/baguette + name = "baguette" + adjective = "baguette-cut" + desc = "A square-cut gemstone." + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/decl/gemstone_cut/hexagon + name = "hexagon" + adjective = "hexagon-cut" + desc = "A hexagon-cut gemstone." + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/decl/gemstone_cut/octagon + name = "octagon" + adjective = "octagon-cut" + desc = "A octagon-cut gemstone." + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/decl/gemstone_cut/round + name = "round" + adjective = "round-cut" + desc = "A round-cut gemstone." + icon = 'icons/obj/items/gemstones/round.dmi' diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index da2c66433b4b..1f450a9aadff 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -176,18 +176,6 @@ if(istype(drone)) drone.transfer_personality(candidate.client) -/****************** -* Wizard Familiar * -******************/ -/decl/ghosttrap/wizard_familiar - name = "wizard familiar" - pref_check = "ghost_wizard" - ghost_trap_message = "They are occupying a familiar now." - ban_checks = list(/decl/special_role/wizard) - -/decl/ghosttrap/wizard_familiar/welcome_candidate(var/mob/target) - return 0 - // Stub PAI ghost trap so that PAI shows up in the ghost role list. // Actually invoking this ghost trap as normal will not do anything. /decl/ghosttrap/personal_ai diff --git a/code/modules/holidays/holiday_hook.dm b/code/modules/holidays/holiday_hook.dm index 6b6870c5bb03..231c1a056fdf 100644 --- a/code/modules/holidays/holiday_hook.dm +++ b/code/modules/holidays/holiday_hook.dm @@ -1,8 +1,3 @@ -//Uncommenting ALLOW_HOLIDAYS in configuration will enable this hook. -/hook/startup/proc/updateHoliday() - update_holiday() - return TRUE - /proc/update_holiday() if(!get_config_value(/decl/config/toggle/allow_holidays)) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 3a497c97ce27..843d0ed4d48f 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -144,7 +144,7 @@ update_projections() to_chat(user, "You vastly increase projector power and override the safety and security protocols.") to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [global.using_map.company_name] maintenance and do not use the simulator.") - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + log_game("[key_name(user)] emagged the Holodeck Control Computer") src.updateUsrDialog() return 1 else diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 25f9dca52a4e..f92af368dcd8 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -96,6 +96,10 @@ return ..() /obj/item/integrated_circuit/smart/advanced_pathfinder/do_work() + + if(waiting_for_path) + return + if(!assembly) activate_pin(3) return @@ -119,20 +123,30 @@ if(Pl&&islist(Pl)) idc.access = Pl var/turf/a_loc = get_turf(assembly) - var/list/P = AStar(a_loc, locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, 200, id=idc, exclude=get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom))) + SSpathfinding.enqueue_mover( + src, + locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), + new /datum/pathfinding_metadata( + _max_node_depth = 200, + _id = idc, + _obstacle = get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom)) + ) + ) - if(!P) - activate_pin(3) - return - else - var/list/Xn = new/list(P.len) - var/list/Yn = new/list(P.len) - var/turf/T - for(var/i =1 to P.len) - T=P[i] - Xn[i] = T.x - Yn[i] = T.y - set_pin_data(IC_OUTPUT, 1, Xn) - set_pin_data(IC_OUTPUT, 2, Yn) - push_data() - activate_pin(2) +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_not_found() + ..() + activate_pin(3) + +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_found(list/path) + ..() + var/list/Xn = new/list(path.len) + var/list/Yn = new/list(path.len) + var/turf/T + for(var/i = 1 to path.len) + T=path[i] + Xn[i] = T.x + Yn[i] = T.y + set_pin_data(IC_OUTPUT, 1, Xn) + set_pin_data(IC_OUTPUT, 2, Yn) + push_data() + activate_pin(2) diff --git a/code/modules/item_worth/_helpers.dm b/code/modules/item_worth/_helpers.dm deleted file mode 100644 index 8841debc67a8..000000000000 --- a/code/modules/item_worth/_helpers.dm +++ /dev/null @@ -1,3 +0,0 @@ -//Workaround by Ginja due to the fact initial(parent_type) does not work. - -#define PARENT(x) text2path(replacetext("[x]", regex("/\[^/\]+$"), "")) \ No newline at end of file diff --git a/code/modules/locks/lock.dm b/code/modules/locks/lock.dm index 82692f605865..20f148f194c6 100644 --- a/code/modules/locks/lock.dm +++ b/code/modules/locks/lock.dm @@ -20,6 +20,7 @@ var/lock_data = "" //basically a randomized string. The longer the string the more complex the lock. var/atom/holder var/material + var/lockpicking_skill = SKILL_DEVICES /datum/lock/New(var/atom/h, var/complexity = 1, var/mat) holder = h @@ -77,9 +78,9 @@ if(!unlock_power) return FALSE user.visible_message("\The [user] begins to pick \the [holder]'s lock with \the [I].", SPAN_NOTICE("You begin picking \the [holder]'s lock.")) - if(!do_after(user, 2 SECONDS, holder)) + if(!user.do_skilled(2 SECONDS, lockpicking_skill, holder, check_holding = TRUE, set_cooldown = TRUE)) return FALSE - if(prob(20*(unlock_power/getComplexity()))) + if(!user.skill_fail_prob(lockpicking_skill, 100 - (20*(unlock_power/getComplexity())), SKILL_EXPERT)) to_chat(user, SPAN_NOTICE("You pick open \the [holder]'s lock!")) unlock(lock_data) return TRUE @@ -88,4 +89,4 @@ I.take_damage(rand(5,10)) else to_chat(user, SPAN_WARNING("You fail to pick open \the [holder].")) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index ac7fc8ae4492..f5286e91141f 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -219,3 +219,8 @@ . += " [singular_name]" return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) return "[amount] [.] [plural_name]" + +/obj/item/stack/material/proc/matter_units_to_sheets(used) + if(!material || get_reinforced_material()) + return 0 + return ceil(used / matter_per_piece[material.type]) \ No newline at end of file diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 01aa188e0cc5..f4a057dd4115 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -125,6 +125,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // Icons var/icon_base = 'icons/turf/walls/solid.dmi' var/icon_base_natural = 'icons/turf/walls/natural.dmi' + /// Either the icon used for reinforcement, or a list of icons to pick from. var/icon_reinf = 'icons/turf/walls/reinforced_metal.dmi' var/wall_flags = 0 var/list/wall_blend_icons = list() // Which wall icon types walls of this material type will consider blending with. Assoc list (icon path = TRUE/FALSE) @@ -363,6 +364,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /// If an item has a null paint_verb, it automatically sets it based on material. var/paint_verb = "painted" + /// Chance of a natural wall made of this material dropping a gemstone, if the gemstone_types list is populated. + var/gemstone_chance = 5 + /// Assoc weighted list of gemstone material types to weighting. + var/list/gemstone_types + // Placeholders for light tiles and rglass. /decl/material/proc/reinforce(var/mob/user, var/obj/item/stack/material/used_stack, var/obj/item/stack/material/target_stack, var/use_sheets = 1) if(!used_stack.can_use(use_sheets)) @@ -558,13 +564,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) . += "'[icon_base_natural]' - missing natural shine icon state 'shine[i]'" if(icon_reinf) - if(use_reinf_state) - if(!check_state_in_icon(use_reinf_state, icon_reinf)) - . += "'[icon_reinf]' - missing reinf icon state '[use_reinf_state]'" - else - for(var/i = 0 to 7) - if(!check_state_in_icon("[i]", icon_reinf)) - . += "'[icon_reinf]' - missing directional reinf icon state '[i]'" + var/list/all_reinf_icons = islist(icon_reinf) ? icon_reinf : list(icon_reinf) + for(var/sub_icon in all_reinf_icons) + if(use_reinf_state) + if(!check_state_in_icon(use_reinf_state, sub_icon)) + . += "'[sub_icon]' - missing reinf icon state '[use_reinf_state]'" + else + for(var/i = 0 to 7) + if(!check_state_in_icon(num2text(i), sub_icon)) + . += "'[sub_icon]' - missing directional reinf icon state '[i]'" if(length(color) != 7) . += "invalid color (not #RRGGBB)" @@ -741,7 +749,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing. /decl/material/proc/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) if(accelerant_value != FUEL_VALUE_NONE && amount && istype(M)) - M.fire_stacks += floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR) + M.adjust_fire_intensity(floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR)) #undef FLAMMABLE_LIQUID_DIVISOR /decl/material/proc/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 76caa77b46fe..e9ca35c6c780 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -87,11 +87,11 @@ /decl/material/liquid/water/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) ..() if(istype(M)) - var/needed = M.fire_stacks * 10 + var/needed = M.get_fire_intensity() * 10 if(amount > needed) - M.fire_stacks = 0 - M.ExtinguishMob() + M.set_fire_intensity(0) + M.extinguish_fire() holder.remove_reagent(type, needed) else - M.adjust_fire_stacks(-(amount / 10)) + M.adjust_fire_intensity(-(amount / 10)) holder.remove_reagent(type, amount) diff --git a/code/modules/materials/definitions/solids/materials_solid_butchery.dm b/code/modules/materials/definitions/solids/materials_solid_butchery.dm index 666d18c6517f..f1bdababb123 100644 --- a/code/modules/materials/definitions/solids/materials_solid_butchery.dm +++ b/code/modules/materials/definitions/solids/materials_solid_butchery.dm @@ -24,6 +24,8 @@ reagent_overlay = "soup_chunks" nutriment_factor = 10 allergen_flags = ALLERGEN_MEAT + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 /decl/material/solid/organic/meat/egg name = "egg yolk" diff --git a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm index f0718ad4ccfe..dcb3b5d38a62 100644 --- a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm +++ b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm @@ -1,54 +1,69 @@ /decl/material/solid/gemstone - name = null - flags = MAT_FLAG_UNMELTABLE - cut_delay = 60 - color = COLOR_DIAMOND - opacity = 0.4 - shard_type = SHARD_SHARD - tableslam_noise = 'sound/effects/Glasshit.ogg' - reflectiveness = MAT_VALUE_MIRRORED - conductive = 0 - ore_icon_overlay = "gems" - default_solid_form = /obj/item/stack/material/gemstone - abstract_type = /decl/material/solid/gemstone - sound_manipulate = 'sound/foley/pebblespickup1.ogg' - sound_dropped = 'sound/foley/pebblesdrop1.ogg' + flags = MAT_FLAG_UNMELTABLE + cut_delay = 60 + color = COLOR_DIAMOND + opacity = 0.4 + shard_type = SHARD_SHARD + tableslam_noise = 'sound/effects/Glasshit.ogg' + conductive = 0 + ore_icon_overlay = "gems" + default_solid_form = /obj/item/stack/material/gemstone + abstract_type = /decl/material/solid/gemstone + sound_manipulate = 'sound/foley/pebblespickup1.ogg' + sound_dropped = 'sound/foley/pebblesdrop1.ogg' + exoplanet_rarity_plant = MAT_RARITY_UNCOMMON + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + dissolves_in = MAT_SOLVENT_IMMUNE + dissolves_into = null + hardness = MAT_VALUE_VERY_HARD + reflectiveness = MAT_VALUE_VERY_SHINY + construction_difficulty = MAT_VALUE_VERY_HARD_DIY /decl/material/solid/gemstone/diamond - name = "diamond" - uid = "solid_diamond" - lore_text = "An extremely hard allotrope of carbon. Valued for its use in industrial tools." - melting_point = 4300 - boiling_point = null - ignition_point = null - brute_armor = 10 - burn_armor = 50 // Diamond walls are immune to fire, therefore it makes sense for them to be almost undamageable by burn damage type. - stack_origin_tech = @'{"materials":6}' - hardness = MAT_VALUE_VERY_HARD + 20 - construction_difficulty = MAT_VALUE_VERY_HARD_DIY - ore_name = "rough diamonds" - ore_result_amount = 1 - ore_spread_chance = 10 - ore_scan_icon = "mineral_rare" - xarch_source_mineral = /decl/material/gas/ammonia - value = 1.8 - sparse_material_weight = 5 - rich_material_weight = 5 - ore_type_value = ORE_PRECIOUS - ore_data_value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + name = "diamond" + uid = "solid_diamond" + lore_text = "An extremely hard allotrope of carbon. Valued for its use in industrial tools." + melting_point = 4300 + boiling_point = null + ignition_point = null + brute_armor = 10 + burn_armor = 50 // Diamond walls are immune to fire, therefore it makes sense for them to be almost undamageable by burn damage type. + stack_origin_tech = @'{"materials":6}' + hardness = MAT_VALUE_VERY_HARD + 20 + ore_name = "rough diamonds" + ore_result_amount = 1 + ore_spread_chance = 10 + ore_scan_icon = "mineral_rare" + xarch_source_mineral = /decl/material/gas/ammonia + value = 1.8 + sparse_material_weight = 5 + rich_material_weight = 5 + ore_type_value = ORE_PRECIOUS + ore_data_value = 2 /decl/material/solid/gemstone/crystal - name = "crystal" - uid = "solid_crystal" - hardness = MAT_VALUE_VERY_HARD - reflectiveness = MAT_VALUE_VERY_SHINY + name = "crystal" + uid = "solid_crystal" + value = 2 hidden_from_codex = TRUE - value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + +/decl/material/solid/gemstone/ruby + name = "ruby" + lore_text = "A rich red stone sometimes found in marble." + uid = "solid_ruby" + value = 1.6 + color = "#d00000" + +/decl/material/solid/gemstone/sapphire + name = "sapphire" + lore_text = "A deep blue gemstone sometimes found in clay or other sediment." + uid = "solid_sapphite" + value = 1.6 + color = "#2983de" + +/decl/material/solid/gemstone/topaz + name = "topaz" + lore_text = "A golden gemstone sometimes found in granite." + uid = "solid_topaz" + value = 1.6 + color = "#f7b92d" diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index d5a796870133..ee7d435e09da 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -78,6 +78,7 @@ /decl/material/solid/metal/gold name = "gold" + adjective_name = "golden" codex_name = "elemental gold" uid = "solid_gold" lore_text = "A heavy, soft, ductile metal. Once considered valuable enough to back entire currencies, now predominantly used in corrosion-resistant electronics." diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 2be84c6c5df9..3dea5d14d81e 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -258,6 +258,8 @@ // lower than the temperature expected from a kiln so that clay can be used to make bricks to make a high-temperature kiln. bakes_into_at_temperature = 950 CELSIUS can_backfill_turf_type = /turf/floor/clay + gemstone_chance = 0.01 + gemstone_types = list(/decl/material/solid/gemstone/sapphire = 1) /decl/material/solid/soil name = "soil" diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 6334b03f1b8e..acf1e65ed86f 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -51,6 +51,7 @@ brute_armor = 15 explosion_resistance = 15 integrity = 500 //granite is very strong + gemstone_types = list(/decl/material/solid/gemstone/topaz = 1) dissolves_into = list( /decl/material/solid/silicon = 0.75, /decl/material/solid/bauxite = 0.15, @@ -88,6 +89,7 @@ brute_armor = 3 integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system construction_difficulty = MAT_VALUE_HARD_DIY + gemstone_types = list(/decl/material/solid/gemstone/ruby = 1) /decl/material/solid/stone/basalt name = "basalt" diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index ac5c1372920a..e4cb6575b1c3 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -12,6 +12,14 @@ 'icons/turf/walls/log.dmi' = TRUE, 'icons/turf/walls/metal.dmi' = TRUE ) + icon_reinf = list( + 'icons/turf/walls/reinforced_timber.dmi', + 'icons/turf/walls/reinforced_timber_alt_1.dmi', + 'icons/turf/walls/reinforced_timber_alt_2.dmi', + 'icons/turf/walls/reinforced_timber_alt_3.dmi', + 'icons/turf/walls/reinforced_timber_alt_4.dmi' + ) + use_reinf_state = null table_icon_base = "wood" bench_icon = 'icons/obj/structures/wood_benches.dmi' pew_icon = 'icons/obj/structures/wood_pews.dmi' diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index 2f857da4e95f..1e17f9f3851f 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -114,6 +114,11 @@ STACK_SUBTYPES(plastic, "plastic", solid/organic/pl STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, strut, null) STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, strut, null) +STACK_SUBTYPES(steel, "steel", solid/metal/steel, rods, null) +STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, rods, null) +STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, rods, null) +STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, rods, null) + STACK_SUBTYPES(cotton, "cotton", solid/organic/cloth, thread, null) STACK_SUBTYPES(dried_gut, "dried gut", solid/organic/leather/gut, thread, null) diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index cf8ddd36474d..afabc40873b7 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -160,14 +160,3 @@ max_icon_state = "sheet-strut-max" stack_merge_type = /obj/item/stack/material/strut crafting_stack_type = /obj/item/stack/material/strut - -/obj/item/stack/material/strut/cyborg - name = "metal strut synthesizer" - desc = "A device that makes metal strut." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - material = /decl/material/solid/metal/steel - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index f645599c8ac1..f76503b97bbf 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -517,7 +517,7 @@ for(var/turf/asteroid as anything in RANGE_TURFS(target, 1)) if (!(get_dir(owner, asteroid) & owner.dir)) continue - if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources()) + if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources(user)) drill_head.durability -= 1 scoop_ore(asteroid) return diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 77fc243c7057..bd5306b18bb6 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -314,7 +314,7 @@ if(!silent) to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return - hud_open.toggled() + hud_open.toggled(user) if(!silent) to_chat(user, SPAN_NOTICE("You open the hatch and climb out of \the [src].")) else @@ -506,7 +506,7 @@ to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return TRUE if(hud_open) - hud_open.toggled() + hud_open.toggled(user) return TRUE /mob/living/exosuit/default_hurt_interaction(var/mob/user) diff --git a/code/modules/mining/drilling/drill_act.dm b/code/modules/mining/drilling/drill_act.dm index 6a17a4c5b534..39759df1a4c2 100644 --- a/code/modules/mining/drilling/drill_act.dm +++ b/code/modules/mining/drilling/drill_act.dm @@ -1,7 +1,7 @@ /turf/proc/drill_act() SHOULD_CALL_PARENT(TRUE) drop_diggable_resources() - dig_pit(MAT_VALUE_VERY_HARD) + dig_pit(tool_hardness = MAT_VALUE_VERY_HARD) var/base_turf = get_base_turf_by_area(src) if(!istype(src, base_turf)) return ChangeTurf(base_turf) diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index b77e158dbe09..f61ac8e68862 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -31,7 +31,7 @@ return insert_ore(W, user) if(W.storage) var/added_ore = FALSE - W.storage.hide_from(usr) + W.storage.hide_from(user) for(var/obj/item/stack/material/ore/O in W.storage.get_contents()) if(total_ores >= maximum_ores) break diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 1b7d470abc8a..4986952e1305 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -51,7 +51,7 @@ spawn_gibber(lastloc) //This is the proc for turning a mob into ash. Mostly a copy of gib code (above). -//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. +//Originally created for Disintegrate. I've removed the virus code since it's irrelevant here. //Dusting robots does not eject the brain, so it's a bit more powerful than gib() /N /mob/proc/dust() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index fab8219c1698..ff453a99da4f 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -95,7 +95,7 @@ if(access_scanner.allowed(user) && !open) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") - Interact(usr) + Interact(user) else if(open) to_chat(user, "Please close the access panel before locking it.") else @@ -105,7 +105,7 @@ if(!locked) open = !open to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") - Interact(usr) + Interact(user) else to_chat(user, "You need to unlock the controls first.") return TRUE @@ -242,7 +242,7 @@ resetTarget() lookForTargets() if(will_patrol && !LAZYLEN(grabbed_by) && !target) - if(patrol_path && patrol_path.len) + if(length(patrol_path)) for(var/i = 1 to patrol_speed) sleep(20 / (patrol_speed + 1)) handlePatrol() @@ -266,7 +266,7 @@ if(!target || !target.loc) return if(get_dist(src, target) > min_target_dist) - if(!target_path.len || get_turf(target) != target_path[target_path.len]) + if(!length(target_path) || get_turf(target) != target_path[target_path.len]) calcTargetPath() if(makeStep(target_path)) frustration = 0 @@ -297,9 +297,9 @@ return /mob/living/bot/proc/startPatrol() - var/turf/T = getPatrolTurf() - if(T) - patrol_path = AStar(get_turf(loc), T, TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_patrol_dist, id = botcard, exclude = obstacle) + var/turf/target_turf = getPatrolTurf() + if(target_turf) + patrol_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = target_turf, max_node_depth = max_patrol_dist, id = botcard, exclude = obstacle, check_tick = TRUE) if(!patrol_path) patrol_path = list() obstacle = null @@ -331,23 +331,22 @@ return /mob/living/bot/proc/calcTargetPath() - target_path = AStar(get_turf(loc), get_turf(target), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard, exclude = obstacle) - if(!target_path) - if(target && target.loc) - ignore_list |= target - resetTarget() - obstacle = null - return + target_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = get_turf(target), max_node_depth = max_target_dist, min_target_dist = min_target_dist, id = botcard, exclude = obstacle, check_tick = TRUE) + if(length(target_path)) + return + if(target?.loc) + ignore_list |= target + resetTarget() + obstacle = null /mob/living/bot/proc/makeStep(var/list/path) - if(!path.len) - return 0 - var/turf/T = path[1] - if(get_turf(src) == T) - path -= T + if(!length(path)) + return FALSE + var/turf/target_turf = path[1] + if(get_turf(src) == target_turf) + path -= target_turf return makeStep(path) - - return step_towards(src, T) + return step_towards(src, target_turf) /mob/living/bot/proc/resetTarget() target = null @@ -371,70 +370,6 @@ set_light(0) update_icon() -/******************************************************************/ -// Navigation procs -// Used for A-star pathfinding - - -// Returns the surrounding cardinal turfs with open links -// Including through doors openable with the ID -/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) - var/L[] = new() - - for(var/d in global.cardinal) - var/turf/T = get_step(src, d) - if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - - -// Returns true if a link between A and B is blocked -// Movement through doors allowed if ID has access -/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) - - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal - var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) - return 0 - - var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) - return 0 - return 1 - - if(DirBlockedWithAccess(A,adir, ID)) - return 1 - - if(DirBlockedWithAccess(B,rdir, ID)) - return 1 - - for(var/obj/O in B) - if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) - return 1 - - return 0 - -// Returns true if direction is blocked from loc -// Checks doors against access with given ID -/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if( dir & D.dir ) return !D.check_access(ID) - - //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) - //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) - else return !D.check_access(ID) // it's a real, air blocking door - return 0 - /mob/living/bot/GetIdCards(list/exceptions) . = ..() if(istype(botcard) && !is_type_in_list(botcard, exceptions)) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index e989ba53b320..0381d5de33f7 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -43,11 +43,14 @@ /mob/living/bot/cleanbot/confirmTarget(var/obj/effect/decal/cleanable/D) if(!..()) - return 0 + return FALSE + if(istype(D, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = D + return dirt.dirt_amount >= 25 for(var/T in target_types) if(istype(D, T)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 86a8a9411890..0e027aa687ba 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -123,24 +123,6 @@ target = source return -/mob/living/bot/farmbot/calcTargetPath() // We need to land NEXT to the tray, because the tray itself is impassable - for(var/trayDir in list(NORTH, SOUTH, EAST, WEST)) - target_path = AStar(get_turf(loc), get_step(get_turf(target), trayDir), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard) - if(target_path) - break - if(!target_path) - ignore_list |= target - target = null - target_path = list() - return - -/mob/living/bot/farmbot/stepToTarget() // Same reason - var/turf/T = get_turf(target) - if(!target_path.len || !T.Adjacent(target_path[target_path.len])) - calcTargetPath() - makeStep(target_path) - return - /mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) . = ..() if(.) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index bb9cf31e58e4..437ef6164511 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -183,7 +183,7 @@ /mob/living/bot/mulebot/calcTargetPath() ..() - if(!target_path.len && target != home) // I presume that target is not null + if(!length(target_path) && target != home) // I presume that target is not null resetTarget() target = home targetName = "Home" diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index db61156edfce..ddcaa27e09f9 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -83,12 +83,13 @@ else msg += "[use_He] [use_is] looking a bit damp.\n" - if(fire_stacks > 0) + var/fire_level = get_fire_intensity() + if(fire_level > 0) msg += "[use_He] [use_is] looking highly flammable!\n" - else if(fire_stacks < 0) + else if(fire_level < 0) msg += "[use_He] [use_is] looking rather damp.\n" - if(on_fire) + if(is_on_fire()) msg += "[use_He] [use_is] on fire!.\n" var/ssd_msg = species.get_ssd(src) @@ -268,13 +269,13 @@ return /mob/living/human/getHUDsource(hudtype) - var/obj/item/clothing/glasses/pronouns = get_equipped_item(slot_glasses_str) - if(!istype(pronouns)) + var/obj/item/clothing/glasses/glasses = get_equipped_item(slot_glasses_str) + if(!istype(glasses)) return ..() - if(pronouns.glasses_hud_type & hudtype) - return pronouns - if(pronouns.hud && (pronouns.hud.glasses_hud_type & hudtype)) - return pronouns.hud + if(glasses.glasses_hud_type & hudtype) + return glasses + if(glasses.hud && (glasses.hud.glasses_hud_type & hudtype)) + return glasses.hud /mob/living/silicon/robot/getHUDsource(hudtype) for(var/obj/item/borg/sight/sight in list(module_state_1, module_state_2, module_state_3)) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index b4a211d0537c..fb6b5abe17ba 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -84,9 +84,9 @@ . = ..() if(statpanel("Status")) - var/obj/item/gps/pronouns = get_active_held_item() - if(istype(pronouns)) - stat("Coordinates:", "[pronouns.get_coordinates()]") + var/obj/item/gps/gps = get_active_held_item() + if(istype(gps)) + stat("Coordinates:", "[gps.get_coordinates()]") stat("Intent:", "[get_intent().name]") stat("Move Mode:", "[move_intent.name]") @@ -182,7 +182,7 @@ var/datum/computer_file/report/crew_record/R = network.get_crew_record_by_name(perpname) if(R) var/setcriminal = input(user, "Specify a new criminal status for this person.", "Security HUD", R.get_criminalStatus()) as null|anything in global.security_statuses - if(hasHUD(usr, HUD_SECURITY) && setcriminal) + if(hasHUD(user, HUD_SECURITY) && setcriminal) R.set_criminalStatus(setcriminal) modified = 1 @@ -196,11 +196,11 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(user, "Unable to locate a data core entry for this person.") return TOPIC_HANDLED if (href_list["secrecord"]) - if(hasHUD(usr, HUD_SECURITY)) + if(hasHUD(user, HUD_SECURITY)) var/perpname = "wot" var/read = 0 @@ -274,11 +274,11 @@ var/datum/computer_file/report/crew_record/E = network.get_crew_record_by_name(perpname) if(E) if(hasHUD(user, HUD_MEDICAL)) - to_chat(usr, "Name: [E.get_name()]") - to_chat(usr, "Gender: [E.get_gender()]") - to_chat(usr, "Species: [E.get_species_name()]") - to_chat(usr, "Blood Type: [E.get_bloodtype()]") - to_chat(usr, "Details: [E.get_medical_record()]") + to_chat(user, "Name: [E.get_name()]") + to_chat(user, "Gender: [E.get_gender()]") + to_chat(user, "Species: [E.get_species_name()]") + to_chat(user, "Blood Type: [E.get_bloodtype()]") + to_chat(user, "Details: [E.get_medical_record()]") read = 1 if(!read) to_chat(user, "Unable to locate a data core entry for this person.") diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index e88990677b46..83b036ada13d 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -99,7 +99,7 @@ if(user == src) check_self_injuries() return TRUE - if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) + if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !is_on_fire() && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) if (performing_cpr) performing_cpr = FALSE else diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index 90c8db6b47ab..c8f5f9083922 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -97,8 +97,8 @@ target.show_message("You hear a voice that seems to echo around the room: [say]") usr.show_message("You project your mind into [target.real_name]: [say]") log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]") - for(var/mob/observer/ghost/pronouns in global.player_list) - pronouns.show_message("Telepathic message from [src] to [target]: [say]") + for(var/mob/observer/ghost/ghost in global.player_list) + ghost.show_message("Telepathic message from [src] to [target]: [say]") /mob/living/human/proc/remoteobserve() set name = "Remote View" diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index b6a065fc2f73..1bb84a587db9 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -258,7 +258,7 @@ return /mob/living/human/get_bodytemperature_difference() - if (on_fire) + if (is_on_fire()) return 0 //too busy for pesky metabolic regulation return ..() @@ -490,7 +490,7 @@ // Apply a fire overlay if we're burning. var/crit_markers = get_ui_icon(client?.prefs?.UI_style, UI_ICON_CRIT_MARKER) - if(on_fire) + if(is_on_fire()) health_images += image(crit_markers, "burning") // Show a general pain/crit indicator if needed. diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index d1c508dcd447..34fcb8ccc310 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -139,7 +139,7 @@ Please contact me on #coderbus IRC. ~Carn x return var/matrix/M = matrix() - if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) + if(current_posture?.prone && !isnull(root_bodytype.prone_overlay_offset) && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) var/mangle_planes = FALSE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e73ef41b016b..fd868a66a6ce 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -23,6 +23,8 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) + if(QDELETED(src)) // Destroyed by fire or pressure damage in handle_environment() + return PROCESS_KILL handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() @@ -121,7 +123,7 @@ return TRUE /mob/living/proc/experiences_hunger_and_thirst() - return TRUE + return !isSynthetic() // Doesn't really apply to robots. Maybe unify this with cells in the future. /mob/living/proc/get_hunger_factor() var/decl/species/my_species = get_species() @@ -631,7 +633,7 @@ // Calculate the expected and actual number of functioning legs we have. var/has_sufficient_working_legs = TRUE - var/list/root_limb_tags = root_bodytype.organ_tags_by_category[ORGAN_CATEGORY_STANCE_ROOT] + var/list/root_limb_tags = root_bodytype.get_expected_organ_tags_for_category(ORGAN_CATEGORY_STANCE_ROOT) var/minimum_working_legs = ceil(length(root_limb_tags) * 0.5) if(minimum_working_legs > 0) var/leg_count = 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4ca6afa75455..df4f9b1c97d3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -36,7 +36,7 @@ if(!..()) return 0 - usr.visible_message("[src] points to [A]") + visible_message("[src] points to [A]") return 1 /*one proc, four uses @@ -312,8 +312,8 @@ default behaviour is: BITSET(hud_updateflag, HEALTH_HUD) BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) if (cuffs) try_unequip(cuffs, get_turf(src)) @@ -551,8 +551,8 @@ default behaviour is: spawn() escape_buckle() return TRUE //drop && roll - else if(on_fire) - fire_stacks = max(0, fire_stacks-1.2) + else if(is_on_fire()) + set_fire_intensity(max(0, get_fire_intensity()-1.2)) SET_STATUS_MAX(src, STAT_WEAK, 3) spin(32,2) var/decl/pronouns/pronouns = get_pronouns() @@ -561,12 +561,12 @@ default behaviour is: SPAN_NOTICE("You stop, drop, and roll!") ) sleep(3 SECONDS) - if(fire_stacks <= 0) + if(get_fire_intensity() <= 0) visible_message( SPAN_NOTICE("\The [src] successfully extinguishes [pronouns.him][pronouns.self]!"), SPAN_NOTICE("You extinguish yourself.") ) - ExtinguishMob() + extinguish_fire() return TRUE //Breaking out of a structure? @@ -657,7 +657,7 @@ default behaviour is: if(length(selectable_postures) == 1) selected_posture = selectable_postures[1] else - selected_posture = input(usr, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures + selected_posture = input(src, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures if(!selected_posture || length(get_available_postures()) <= 1 || incapacitated(INCAPACITATION_KNOCKOUT) || !canClick()) return if(current_posture == selected_posture || !(selected_posture in get_selectable_postures())) @@ -920,7 +920,7 @@ default behaviour is: nutrition = clamp(amt, 0, get_max_nutrition()) /mob/living/proc/get_nutrition() - return nutrition + return isSynthetic() ? get_max_nutrition() : nutrition /mob/living/proc/adjust_nutrition(var/amt) set_nutrition(get_nutrition() + amt) @@ -929,7 +929,7 @@ default behaviour is: return 500 /mob/living/proc/get_hydration(var/amt) - return hydration + return isSynthetic() ? get_max_hydration() : hydration /mob/living/proc/set_hydration(var/amt) hydration = clamp(amt, 0, get_max_hydration()) @@ -1063,7 +1063,7 @@ default behaviour is: if(user.mob_size >= exosuit.body.min_pilot_size && user.mob_size <= exosuit.body.max_pilot_size) exosuit.enter(src) else - to_chat(usr, SPAN_WARNING("You cannot pilot a exosuit of this size.")) + to_chat(user, SPAN_WARNING("You cannot pilot a exosuit of this size.")) return TRUE . = ..() @@ -1079,17 +1079,19 @@ default behaviour is: ADJ_STATUS(src, STAT_STUN, -3) ADJ_STATUS(src, STAT_WEAK, -3) - if(fire_stacks >= target.fire_stacks + 3) - target.fire_stacks += 1 - fire_stacks -= 1 - else if(target.fire_stacks >= fire_stacks + 3) - fire_stacks += 1 - target.fire_stacks -= 1 + var/fire_level = get_fire_intensity() + var/target_fire_level = target.get_fire_intensity() + if(fire_level >= target_fire_level + 3) + target.adjust_fire_intensity(1) + adjust_fire_intensity(-1) + else if(target_fire_level >= fire_level + 3) + adjust_fire_intensity(1) + target.adjust_fire_intensity(-1) - if(on_fire && !target.on_fire) - target.IgniteMob() - else if(!on_fire && target.on_fire) - IgniteMob() + if(is_on_fire() && !target.is_on_fire()) + target.ignite_fire() + else if(!is_on_fire() && target.is_on_fire()) + ignite_fire() /mob/living/proc/jump_layer_shift() jumping = TRUE @@ -1359,11 +1361,6 @@ default behaviour is: return FALSE return TRUE -//gets name from ID or PDA itself, ID inside PDA doesn't matter -//Useful when player is being seen by other mobs -/mob/living/proc/get_id_name(if_no_id = "Unknown") - return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id - /mob/living/get_default_temperature_threshold(threshold) if(isSynthetic()) switch(threshold) diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index e7a7ae239f9a..055b82d84bfc 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -52,11 +52,11 @@ // Returns TRUE if further interactions should be halted, FALSE otherwise. /mob/living/proc/try_extinguish(mob/living/user) - if (!on_fire || !istype(user)) + if (!is_on_fire() || !istype(user)) return FALSE playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (user.on_fire) + if (user.is_on_fire()) user.visible_message( SPAN_WARNING("\The [user] tries to pat out \the [src]'s flames, but to no avail!"), SPAN_WARNING("You try to pat out [src]'s flames, but to no avail! Put yourself out first!") @@ -71,25 +71,25 @@ if(!do_mob(user, src, 15)) return TRUE - fire_stacks -= 0.5 - if (prob(10) && (user.fire_stacks <= 0)) - user.fire_stacks += 1 - user.IgniteMob() - if (user.on_fire) + adjust_fire_intensity(-0.5) + if (prob(10) && (user.get_fire_intensity() <= 0)) + user.adjust_fire_intensity(1) + user.ignite_fire() + if (user.is_on_fire()) user.visible_message( SPAN_DANGER("The fire spreads from \the [src] to \the [user]!"), SPAN_DANGER("The fire spreads to you as well!") ) return TRUE - fire_stacks -= 0.5 //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. - if (fire_stacks <= 0) + adjust_fire_intensity(-0.5) //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. + if (get_fire_intensity() <= 0) user.visible_message( SPAN_NOTICE("\The [user] successfully pats out \the [src]'s flames."), SPAN_NOTICE("You successfully pat out \the [src]'s flames.") ) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) return TRUE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 97fe9281e2c3..a74526afdd40 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -291,91 +291,6 @@ user.do_attack_animation(src) return 1 -/mob/living/proc/can_ignite() - return fire_stacks > 0 && !on_fire - -/mob/living/proc/IgniteMob() - if(can_ignite()) - on_fire = TRUE - set_light(4, l_color = COLOR_ORANGE) - update_fire() - -/mob/living/proc/ExtinguishMob() - if(on_fire) - on_fire = FALSE - fire_stacks = 0 - set_light(0) - update_fire() - -/mob/living/proc/update_fire(var/update_icons=1) - if(on_fire) - var/decl/bodytype/mob_bodytype = get_bodytype() - var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) - set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) - else - set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) - -/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = clamp(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS) - -/mob/living/proc/handle_fire() - if(fire_stacks < 0) - fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly - - if(!on_fire) - return TRUE - else if(fire_stacks <= 0) - ExtinguishMob() //Fire's been put out. - return TRUE - - fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually - - var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) - ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire - return TRUE - - var/turf/location = get_turf(src) - location.hotspot_expose(fire_burn_temperature(), 50, 1) - - var/burn_temperature = fire_burn_temperature() - var/thermal_protection = get_heat_protection(burn_temperature) - - if (thermal_protection < 1 && bodytemperature < burn_temperature) - bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) - - var/species_heat_mod = 1 - - var/protected_limbs = get_heat_protection_flags(burn_temperature) - - if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) - species_heat_mod = 0.5 - else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) - species_heat_mod = 0.75 - - burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) - - if(burn_temperature < 1) - return - - if(has_external_organs()) - for(var/obj/item/organ/external/E in get_external_organs()) - if(!(E.body_part & protected_limbs) && prob(20)) - E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") - else // fallback for simplemobs - take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) - -/mob/living/proc/increase_fire_stacks(exposed_temperature) - if(fire_stacks <= 4 || fire_burn_temperature() < exposed_temperature) - adjust_fire_stacks(2) - -/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) - //once our fire_burn_temperature has reached the temperature of the fire that's giving fire_stacks, stop adding them. - //allow fire_stacks to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. - increase_fire_stacks(exposed_temperature) - IgniteMob() - return ..() - /mob/living/proc/get_cold_protection() return 0 @@ -384,12 +299,12 @@ //Finds the effective temperature that the mob is burning at. /mob/living/proc/fire_burn_temperature() - if (fire_stacks <= 0) + var/fire_level = get_fire_intensity() + if (fire_level <= 0) return 0 - //Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot. //lower limit of 700 K, same as matches and roughly the temperature of a cool flame. - return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2), 700) + return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_level/FIRE_MAX_FIRESUIT_STACKS)**2), 700) /mob/living/proc/reagent_permeability() return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 8d8270d08548..4d894ca4fa90 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -29,8 +29,8 @@ var/mob/living/cameraFollow = null var/list/datum/action/actions = list() - var/on_fire = 0 //The "Are we on fire?" var - var/fire_stacks + VAR_PRIVATE/_on_fire = 0 //The "Are we on fire?" var + VAR_PRIVATE/_fire_intensity var/ticks_since_last_successful_breath = 0 //if we failed to breathe last tick var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. diff --git a/code/modules/mob/living/living_fires.dm b/code/modules/mob/living/living_fires.dm new file mode 100644 index 000000000000..5711910fe86c --- /dev/null +++ b/code/modules/mob/living/living_fires.dm @@ -0,0 +1,96 @@ +/mob/living/is_on_fire() + return _on_fire + +/mob/living/set_fire_intensity(amount) + _fire_intensity = amount + +/mob/living/get_fire_intensity() + return _fire_intensity + +//Adjusting the amount of fire stacks we have on person +/mob/living/adjust_fire_intensity(amount) + _fire_intensity = clamp(_fire_intensity + amount, FIRE_MIN_STACKS, FIRE_MAX_STACKS) + +/mob/living/can_ignite() + return get_fire_intensity() > 0 && !is_on_fire() + +/mob/living/ignite_fire() + if(can_ignite()) + _on_fire = TRUE + set_light(4, l_color = COLOR_ORANGE) + update_fire() + +/mob/living/extinguish_fire(mob/user, no_message = FALSE) + if(is_on_fire()) + _on_fire = FALSE + set_fire_intensity(0) + set_light(0) + update_fire() + +/mob/living/proc/update_fire(var/update_icons=1) + if(is_on_fire()) + var/decl/bodytype/mob_bodytype = get_bodytype() + var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) + set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) + else + set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) + +/mob/living/proc/handle_fire() + var/fire_level = get_fire_intensity() + if(fire_level < 0) + set_fire_intensity(min(0, ++fire_level)) //If we've doused ourselves in water to avoid fire, dry off slowly + fire_level = get_fire_intensity() + + if(!is_on_fire()) + return TRUE + if(fire_level <= 0) + extinguish_fire() //Fire's been put out. + return TRUE + + set_fire_intensity(max(0, fire_level - 0.2)) //I guess the fire runs out of fuel eventually + + var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment + if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) + extinguish_fire() //If there's no oxygen in the tile we're on, put out the fire + return TRUE + + var/turf/location = get_turf(src) + location.hotspot_expose(fire_burn_temperature(), 50, 1) + + var/burn_temperature = fire_burn_temperature() + var/thermal_protection = get_heat_protection(burn_temperature) + + if (thermal_protection < 1 && bodytemperature < burn_temperature) + bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + + var/species_heat_mod = 1 + + var/protected_limbs = get_heat_protection_flags(burn_temperature) + + if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) + species_heat_mod = 0.5 + else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) + species_heat_mod = 0.75 + + burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) + + if(burn_temperature < 1) + return + + if(has_external_organs()) + for(var/obj/item/organ/external/E in get_external_organs()) + if(!(E.body_part & protected_limbs) && prob(20)) + E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") + else // fallback for simplemobs + take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) + +/mob/living/proc/increase_fire_intensity(exposed_temperature) + if(get_fire_intensity() <= 4 || fire_burn_temperature() < exposed_temperature) + adjust_fire_intensity(2) + +/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + //once our fire_burn_temperature has reached the temperature of the fire that's giving fire intensity, stop adding them. + //allow fire intensity to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. + increase_fire_intensity(exposed_temperature) + ignite_fire() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/living_resist.dm b/code/modules/mob/living/living_resist.dm index 9228eda91a5c..c1339fbaefcb 100644 --- a/code/modules/mob/living/living_resist.dm +++ b/code/modules/mob/living/living_resist.dm @@ -13,37 +13,39 @@ if(buckled.can_buckle) buckled.user_unbuckle_mob(src) else - to_chat(usr, "You can't seem to escape from \the [buckled]!") + to_chat(src, "You can't seem to escape from \the [buckled]!") return setClickCooldown(100) unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) + var/decl/pronouns/pronouns = get_pronouns() + visible_message( - "[src] attempts to unbuckle themself!", + "[src] attempts to unbuckle [pronouns.self]!", "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 ) if(unbuckle_time && buckled) var/stages = 2 for(var/i = 1 to stages) - if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!unbuckle_time || do_after(src, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) if(!buckled) return visible_message( - SPAN_WARNING("\The [src] tries to unbuckle themself."), + SPAN_WARNING("\The [src] tries to unbuckle [pronouns.self]."), SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 ) else if(!buckled) return visible_message( - SPAN_WARNING("\The [src] stops trying to unbuckle themself."), + SPAN_WARNING("\The [src] stops trying to unbuckle [pronouns.self]."), SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 ) return visible_message( - SPAN_DANGER("\The [src] manages to unbuckle themself!"), + SPAN_DANGER("\The [src] manages to unbuckle [pronouns.self]!"), SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 ) buckled.user_unbuckle_mob(src) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 6e1a7989b716..0d02001ceae5 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -2,8 +2,6 @@ // Recruiting observers to play as pAIs -var/global/datum/paiController/paiController // Global handler for pAI candidates - /datum/paiCandidate var/name var/key @@ -14,11 +12,7 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/chassis = "Drone" var/say_verb = "Robotic" - -/hook/startup/proc/paiControllerSetup() - paiController = new /datum/paiController() - return 1 - +var/global/datum/paiController/paiController = new /datum/paiController() // Global handler for pAI candidates /datum/paiController var/inquirer = null @@ -27,6 +21,10 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min] +/datum/paiController/New() + ..() + populate_pai_software_list() + /datum/paiController/Topic(href, href_list[]) if(href_list["download"]) var/datum/paiCandidate/candidate = locate(href_list["candidate"]) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 72c1af676bb0..b53b8a9cfe2d 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -19,19 +19,18 @@ var/global/list/pai_emotions = list( var/global/list/pai_software_by_key = list() var/global/list/default_pai_software = list() -/hook/startup/proc/populate_pai_software_list() - var/r = 1 // I would use ., but it'd sacrifice runtime detection +/proc/populate_pai_software_list() + pai_software_by_key = list() + default_pai_software = list() for(var/type in subtypesof(/datum/pai_software)) var/datum/pai_software/P = new type() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] - log_error("pAI software module [P.name] has the same key as [O.name]!") - r = 0 + PRINT_STACK_TRACE("pAI software module [type] has the same key ([P.id]) as [O.type] [O.id]!") continue pai_software_by_key[P.id] = P if(P.default) default_pai_software[P.id] = P - return r /mob/living/silicon/pai/proc/paiInterface() ui_interact(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index ae725a116c6a..0563fce55217 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -178,7 +178,7 @@ if(!get_config_value(/decl/config/toggle/on/allow_drone_spawn) || emagged || should_be_dead()) //It's dead, Dave. to_chat(user, "The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one.") return TRUE - if(!allowed(usr)) + if(!allowed(user)) to_chat(user, "Access denied.") return TRUE var/decl/pronouns/pronouns = user.get_pronouns() @@ -193,7 +193,7 @@ SPAN_DANGER("\The [user] swipes [pronouns.his] ID card through \the [src], attempting to shut it down."), \ SPAN_DANGER("You swipe your ID card through \the [src], attempting to shut it down.")) if(!emagged) - if(allowed(usr)) + if(allowed(user)) shut_down() else to_chat(user, SPAN_DANGER("Access denied.")) @@ -286,8 +286,8 @@ /mob/living/silicon/robot/drone/proc/request_player() if(too_many_active_drones()) return - var/decl/ghosttrap/pronouns = GET_DECL(/decl/ghosttrap/maintenance_drone) - pronouns.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) + var/decl/ghosttrap/ghosttrap = GET_DECL(/decl/ghosttrap/maintenance_drone) + ghosttrap.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) /mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player) if(!player) return diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm index 2711d4981b8b..8a060e833c2f 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm @@ -34,7 +34,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -70,7 +69,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a8da2261da4e..4e2bc0fe3cf5 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -258,12 +258,12 @@ /mob/living/silicon/robot/update_fire() overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") - if(on_fire) + if(is_on_fire()) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") //Silicons don't gain stacks from hotspots, but hotspots can ignite them -/mob/living/silicon/increase_fire_stacks(exposed_temperature) +/mob/living/silicon/increase_fire_intensity(exposed_temperature) return /mob/living/silicon/can_ignite() - return !on_fire + return !is_on_fire() diff --git a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm index c334d6c8bb25..d79de772719c 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm @@ -47,7 +47,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -87,7 +86,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index eeb10eae170c..fe58498a36e8 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -31,7 +31,6 @@ /obj/item/matter_decompiler, /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -84,7 +83,6 @@ for(var/thing in list( /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index eb0a535eec67..6c4ccab5c3a2 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -243,9 +243,9 @@ to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]") -/obj/item/inflatable_dispenser/attack_self() +/obj/item/inflatable_dispenser/attack_self(mob/user) mode = !mode - to_chat(usr, "You set \the [src] to deploy [mode ? "doors" : "walls"].") + to_chat(user, "You set \the [src] to deploy [mode ? "doors" : "walls"].") /obj/item/inflatable_dispenser/afterattack(var/atom/A, var/mob/user) ..(A, user) @@ -301,7 +301,7 @@ if(istype(A, /obj/item/inflatable)) if(istype(A, /obj/item/inflatable/door)) if(stored_doors >= max_doors) - to_chat(usr, "\The [src] is full!") + to_chat(user, "\The [src] is full!") return stored_doors++ qdel(A) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index dd16025496c1..768dc1c0d513 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -71,15 +71,6 @@ /mob/living/silicon/get_dexterity(silent) return dexterity -/mob/living/silicon/experiences_hunger_and_thirst() - return FALSE // Doesn't really apply to robots. Maybe unify this with cells in the future. - -/mob/living/silicon/get_nutrition() - return get_max_nutrition() - -/mob/living/silicon/get_hydration() - return get_max_hydration() - /mob/living/silicon/fully_replace_character_name(new_name) ..() create_or_update_account(new_name) @@ -377,7 +368,7 @@ if(istype(W) && user.try_unequip(W)) W.forceMove(src) stock_parts += W - to_chat(usr, "You install the [W.name].") + to_chat(user, "You install the [W.name].") return TRUE /mob/living/silicon/proc/try_stock_parts_removal(obj/item/W, mob/user) diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm deleted file mode 100644 index 8cefee06d93a..000000000000 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ /dev/null @@ -1,133 +0,0 @@ -/mob/living/simple_animal/familiar - name = "familiar" - desc = "No wizard is complete without a mystical sidekick." - supernatural = 1 - universal_speak = FALSE - universal_understand = TRUE - - min_gas = list(/decl/material/gas/oxygen = 1) - max_gas = null - unsuitable_atmos_damage = 1 - gene_damage = -1 - base_animal_type = /mob/living/simple_animal/familiar - - var/list/wizardy_spells = list() - -/mob/living/simple_animal/familiar/Initialize() - . = ..() - add_language(/decl/language/human/common) - for(var/spell in wizardy_spells) - src.add_spell(new spell, "const_spell_ready") - -/mob/living/simple_animal/familiar/carcinus - name = "carcinus" - desc = "A small crab said to be made of stone and starlight." - icon = 'icons/mob/simple_animal/evilcrab.dmi' - speak_emote = list("chitters","clicks") - max_health = 200 - natural_weapon = /obj/item/natural_weapon/pincers/strong - resistance = 9 - ai = /datum/mob_controller/familiar_crab - -/datum/mob_controller/familiar_crab - can_escape_buckles = TRUE - -/obj/item/natural_weapon/pincers/strong - _base_attack_force = 15 - -/*familiar version of the Pike w/o all the other hostile/carp stuff getting in the way (namely life) -*/ - -/mob/living/simple_animal/familiar/pike - name = "space pike" - desc = "A bigger, more magical cousin of the space carp." - icon = 'icons/mob/simple_animal/spaceshark.dmi' - pixel_x = -16 - offset_overhead_text_x = 16 - - speak_emote = list("gnashes") - max_health = 100 - natural_weapon = /obj/item/natural_weapon/bite - min_gas = null - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) - ai = /datum/mob_controller/familiar_pike - -/datum/mob_controller/familiar_pike - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pike/Process_Spacemove() - return 1 //No drifting in space for space carp! //original comments do not steal - -/mob/living/simple_animal/familiar/horror - name = "horror" - desc = "Looking at it fills you with dread." - icon = 'icons/mob/simple_animal/horror.dmi' - speak_emote = list("moans", "groans") - response_help_1p = "You think better of touching $TARGET$." - response_help_3p = "$USER$ thinks better of touching $TARGET$." - max_health = 150 - natural_weapon = /obj/item/natural_weapon/horror - wizardy_spells = list(/spell/targeted/torment) - -/obj/item/natural_weapon/horror - name = "foul touch" - _base_attack_force = 10 - atom_damage_type = BURN - attack_verb = list("touched") - -/mob/living/simple_animal/familiar/horror/get_death_message(gibbed) - return "rapidly deteriorates" -/mob/living/simple_animal/familiar/horror/get_self_death_message(gibbed) - return "The bonds tying you to this mortal plane have been severed." - -/mob/living/simple_animal/familiar/horror/death(gibbed) - . = ..() - if(. && !gibbed) - spawn_gibber(loc) - qdel(src) - -/mob/living/simple_animal/familiar/minor_amaros - name = "minor amaros" - desc = "A small fluffy alien creature." - icon = 'icons/mob/simple_animal/amaros.dmi' - speak_emote = list("entones") - mob_size = MOB_SIZE_SMALL - max_health = 25 - wizardy_spells = list( - /spell/targeted/heal_target, - /spell/targeted/heal_target/area - ) - -/mob/living/simple_animal/familiar/pet/mouse - name = "elderly mouse" - desc = "A small rodent. It looks very old." - icon = 'icons/mob/simple_animal/mouse_gray.dmi' - speak_emote = list("squeeks") - holder_type = /obj/item/holder - pass_flags = PASS_FLAG_TABLE - mob_size = MOB_SIZE_MINISCULE - response_harm = "stamps on" - max_health = 15 - natural_weapon = /obj/item/natural_weapon/bite/mouse - wizardy_spells = list(/spell/aoe_turf/smoke) - ai = /datum/mob_controller/familiar_mouse - -/datum/mob_controller/familiar_mouse - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pet/mouse/Initialize() - . = ..() - - verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide - -/mob/living/simple_animal/familiar/pet/cat - name = "black cat" - desc = "A pitch black cat. Said to be especially unlucky." - icon = 'icons/mob/simple_animal/cat_black.dmi' - speak_emote = list("meows", "purrs") - holder_type = /obj/item/holder - mob_size = MOB_SIZE_SMALL - max_health = 25 - natural_weapon = /obj/item/natural_weapon/claws/weak - wizardy_spells = list(/spell/targeted/subjugation) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index ae8da0e797f3..be7858c6c04d 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -103,7 +103,7 @@ see_in_dark = 6 max_health = 50 butchery_data = /decl/butchery_data/animal/ruminant/cow - + // When cows can accept food items: /obj/item/food/hay var/static/list/responses = list( "looks at you imploringly", "looks at you pleadingly", diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index c32b39b1a426..2f79162b6c92 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -64,7 +64,7 @@ stop_wandering() stance_step++ if(stance_step >= 20) - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) set_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. else set_stance(STANCE_IDLE) @@ -72,7 +72,7 @@ if(STANCE_ALERT) stop_wandering() var/found_mob = 0 - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) if(!attackable(target)) stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. stance_step++ diff --git a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm index f504d63398e2..1145b90b6e8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -52,8 +52,8 @@ if(LAZYLEN(targets) != 1) body.say("ERROR. TARGET COULD NOT BE PARSED.") return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) set_stance(STANCE_COMMANDED_HEAL) return 1 if(findtext(text,"emergency protocol")) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm index be65f62f7076..b828ae9e7b09 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm @@ -23,7 +23,7 @@ paired_nurse = null /datum/mob_controller/aggressive/giant_spider/guard/proc/find_nurse() - for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in list_targets(10)) + for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in get_raw_target_list()) if(nurse.stat || !istype(nurse.ai, /datum/mob_controller/aggressive/giant_spider/nurse)) continue var/datum/mob_controller/aggressive/giant_spider/nurse/nurse_ai = nurse.ai diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm index 091230eca451..ead786ab340c 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm @@ -26,7 +26,7 @@ /datum/mob_controller/aggressive/megahivebot can_escape_buckles = TRUE -/datum/mob_controller/aggressive/megahivebot/open_fire() +/datum/mob_controller/aggressive/megahivebot/handle_ranged_target(atom/ranged_target) var/mob/living/simple_animal/hostile/hivebot/mega/megabot = body if(!istype(megabot)) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index c2e2b3c5a18a..88defeeaf285 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -45,7 +45,7 @@ var/global/list/protected_objects = list( var/awake = TRUE // Return a list of targets that isn't the creator -/datum/mob_controller/aggressive/mimic/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/mimic/get_valid_targets() var/mob/living/simple_animal/hostile/mimic/mimic = body . = istype(mimic) && mimic.awake && ..() if(length(.) && mimic.creator) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 498adac96b38..e3f5b4fe9ff0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -54,8 +54,15 @@ /mob/living/simple_animal/hostile/malf_drone/has_ranged_attack() return TRUE -/datum/mob_controller/aggressive/malf_drone/list_targets(var/dist = 7) - . = ..(hostile_drone ? hostile_range : dist) +/datum/mob_controller/aggressive/malf_drone/get_raw_target_list() + if(hostile_drone) + target_scan_distance = hostile_range + else + target_scan_distance = initial(target_scan_distance) + . = ..() + +/datum/mob_controller/aggressive/malf_drone/get_valid_targets() + . = ..() for(var/mob/M in .) if(istype(M, body.type)) . -= M diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm index 0541018c1de1..d8443751980f 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -188,8 +188,8 @@ /mob/living/simple_animal/hostile/beast/charbaby/apply_attack_effects(mob/living/target) . = ..() if(prob(10)) - target.adjust_fire_stacks(1) - target.IgniteMob() + target.adjust_fire_intensity(1) + target.ignite_fire() /mob/living/simple_animal/hostile/beast/shantak/lava desc = "A vaguely canine looking beast. It looks as though its fur is made of stone wool." diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 8384fc93a6cd..4218f9176bfa 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -23,13 +23,14 @@ try_destroy_surroundings = FALSE can_escape_buckles = TRUE -/datum/mob_controller/aggressive/slug/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/slug/valid_target(atom/A) . = ..() - var/mob/living/simple_animal/hostile/slug/slug = body - if(istype(slug)) - for(var/mob/living/M in .) - if(slug.check_friendly_species(M)) - . -= M + if(.) + if(!ismob(A)) + return FALSE + var/mob/living/simple_animal/hostile/slug/slug = body + if(slug.check_friendly_species(A)) + return FALSE /mob/living/simple_animal/hostile/slug/proc/check_friendly_species(var/mob/living/M) return istype(M) && M.faction == faction diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index edf74c14dd0f..5ed9d75db534 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -561,10 +561,10 @@ update_flavor_text(href_list["flavor_change"]) return TOPIC_HANDLED -// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/proc/get_comments_record() return +// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["refresh"]) @@ -626,9 +626,6 @@ return TRUE . = ..() -/mob/proc/is_active() - return (0 >= usr.stat) - /mob/proc/can_touch(var/atom/touching) if(!touching.Adjacent(src) || incapacitated()) return FALSE @@ -639,16 +636,6 @@ to_chat(src, SPAN_WARNING("You are buckled down.")) return TRUE -/mob/proc/see(message) - if(!is_active()) - return 0 - to_chat(src, message) - return 1 - -/mob/proc/show_viewers(message) - for(var/mob/M in viewers()) - M.see(message) - /mob/Stat() ..() . = (is_client_active(10 MINUTES)) @@ -806,12 +793,10 @@ to_chat(usr, "You are restrained and cannot do that!") return - var/mob/S = src - var/mob/U = usr var/list/valid_objects = list() var/self = null - if(S == U) + if(src == usr) self = 1 // Removing object from yourself. valid_objects = get_visible_implants(0) @@ -819,16 +804,16 @@ if(self) to_chat(src, "You have nothing stuck in your body that is large enough to remove.") else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + to_chat(usr, "[src] has nothing stuck in their wounds that is large enough to remove.") return var/obj/item/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) to_chat(src, "You attempt to get a good grip on [selection] in your body.") else - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - if(!do_mob(U, S, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! + to_chat(usr, "You attempt to get a good grip on [selection] in [src]'s body.") + if(!do_mob(usr, src, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! return - if(!selection || !S || !U) + if(QDELETED(selection) || QDELETED(src) || QDELETED(usr)) return if(self) @@ -837,10 +822,10 @@ visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") remove_implant(selection) selection.forceMove(get_turf(src)) - if(U.get_empty_hand_slot()) - U.put_in_hands(selection) - if(ishuman(U)) - var/mob/living/human/human_user = U + if(usr.get_empty_hand_slot()) + usr.put_in_hands(selection) + if(ishuman(usr)) + var/mob/living/human/human_user = usr human_user.bloody_hands(src) return 1 @@ -1395,5 +1380,10 @@ /mob/proc/handle_footsteps() return +//gets name from ID or PDA itself, ID inside PDA doesn't matter +//Useful when player is being seen by other mobs +/mob/proc/get_id_name(if_no_id = "Unknown") + return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id + /mob/proc/can_twohand_item(obj/item/item) return FALSE diff --git a/code/modules/mob/mob_automove.dm b/code/modules/mob/mob_automove.dm index ff8d1a6d7bae..f552d4f7c1e6 100644 --- a/code/modules/mob/mob_automove.dm +++ b/code/modules/mob/mob_automove.dm @@ -6,18 +6,60 @@ _automove_target = null return ..() +/mob/path_found(list/path) + ..() + if(islist(path) && length(path) > 1) + path.Cut(1, 2) // Remove the first turf since it's going to be our origin. + if(length(path)) + start_automove(path) + +/mob/path_not_found() + ..() + stop_automove() + /// Called by get_movement_delay() to override the current move intent, in cases where an automove has a delay override. /mob/proc/get_automove_delay() var/datum/automove_metadata/metadata = SSautomove.moving_metadata[src] return metadata?.move_delay +/mob/failed_automove() + ..() + stop_automove() + _automove_target = null + return FALSE + /mob/start_automove(target, movement_type, datum/automove_metadata/metadata) _automove_target = target return ..() // The AI datum may decide to track a target instead of using the mob reference. /mob/get_automove_target(datum/automove_metadata/metadata) - . = (istype(ai) && ai.get_automove_target()) || _automove_target || ..() + . = _automove_target || (istype(ai) && ai.get_automove_target()) || ..() + if(islist(.)) + var/list/path = . + while(length(path) && path[1] == get_turf(src)) + path.Cut(1,2) + if(length(path)) + return path[1] + return null + +/mob/handle_post_automoved(atom/old_loc) + if(istype(ai)) + ai.handle_post_automoved(old_loc) + return + if(!islist(_automove_target) || length(_automove_target) <= 0) + return + var/turf/body_turf = get_turf(src) + if(!istype(body_turf)) + return + var/list/_automove_target_list = _automove_target + if(_automove_target_list[1] != body_turf) + return + if(length(_automove_target_list) > 1) + _automove_target_list.Cut(1, 2) + else + _automove_target_list = null + stop_automove() // We do some early checking here to avoid doing the same checks repeatedly by calling SelfMove(). /mob/can_do_automated_move(variant_move_delay) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c11e15b0580b..21c411010778 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -39,11 +39,10 @@ attack_self() return if(SOUTHWEST) - if(isliving(usr)) - var/mob/living/M = usr - M.toggle_throw_mode() + if(isliving(mob)) + mob.toggle_throw_mode() else - to_chat(usr, "This mob type cannot throw items.") + to_chat(src, "This mob type cannot throw items.") return if(NORTHWEST) mob.hotkey_drop() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f03372203ada..caa16d854fb7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -323,7 +323,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) ordered_submaps = sortTim(SSmapping.submaps.Copy(), /proc/cmp_submap_asc) for(var/datum/submap/submap as anything in ordered_submaps) if(submap?.available()) - dat += "[submap.name] ([submap.archetype.descriptor]):" + dat += "[submap.name] ([submap.archetype.name]):" job_summaries = list() for(var/otherthing in submap.jobs) var/datum/job/job = submap.jobs[otherthing] @@ -482,10 +482,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) /mob/new_player/get_admin_job_string() return "New player" -/hook/roundstart/proc/update_lobby_browsers() - global.using_map.refresh_lobby_browsers() - return TRUE - /mob/new_player/change_mob_type(var/new_type, var/turf/location, var/new_name, var/delete_old_mob = FALSE, var/subspecies) to_chat(usr, SPAN_WARNING("You cannot convert players who have not entered the game yet!")) return FALSE diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index acf4b0af582c..aa1268cbaa5d 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -185,9 +185,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. announce_ghost_joinleave(ghost) -/mob/observer/ghost/is_active() - return FALSE - /mob/observer/ghost/Stat() . = ..() if(statpanel("Status") && SSevac.evacuation_controller) @@ -626,3 +623,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost_all_access = new if(!is_type_in_list(ghost_all_access, exceptions)) LAZYDISTINCTADD(., ghost_all_access) + +/mob/observer/ghost/Login() + ..() + if (ghost_image) + ghost_image.appearance = src + ghost_image.appearance_flags = RESET_ALPHA + SSghost_images.queue_image_update(src) + +/mob/observer/ghost/proc/check_existence_failure() + if(!QDELETED(src) && !key) //we've transferred to another mob. This ghost should be deleted. + qdel(src) + +/mob/observer/ghost/Logout() + ..() + addtimer(CALLBACK(src, PROC_REF(check_existence_failure)), 0) + +/mob/observer/ghost/say(var/message) + sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/code/modules/mob/observer/ghost/login.dm b/code/modules/mob/observer/ghost/login.dm deleted file mode 100644 index f8be3dd46712..000000000000 --- a/code/modules/mob/observer/ghost/login.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/observer/ghost/Login() - ..() - if (ghost_image) - ghost_image.appearance = src - ghost_image.appearance_flags = RESET_ALPHA - SSghost_images.queue_image_update(src) diff --git a/code/modules/mob/observer/ghost/logout.dm b/code/modules/mob/observer/ghost/logout.dm deleted file mode 100644 index 7c125cef367c..000000000000 --- a/code/modules/mob/observer/ghost/logout.dm +++ /dev/null @@ -1,5 +0,0 @@ -/mob/observer/ghost/Logout() - ..() - spawn(0) - if(src && !key) //we've transferred to another mob. This ghost should be deleted. - qdel(src) diff --git a/code/modules/mob/observer/ghost/say.dm b/code/modules/mob/observer/ghost/say.dm deleted file mode 100644 index f30f4a672c10..000000000000 --- a/code/modules/mob/observer/ghost/say.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/observer/ghost/say(var/message) - sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/code/modules/mob/skills/skill_ui.dm b/code/modules/mob/skills/skill_ui.dm index 540b250d4eb0..221439db085b 100644 --- a/code/modules/mob/skills/skill_ui.dm +++ b/code/modules/mob/skills/skill_ui.dm @@ -122,13 +122,20 @@ The generic antag version. . = ..() .["can_choose"] = can_choose() var/list/selection_data = list() - var/decl/skill/skill = GET_DECL(/decl/skill) + var/decl/skill/sample_skill // just used to get the skill level names + for(var/candidate_skill_type in skillset.skill_list) + var/decl/skill/candidate = GET_DECL(candidate_skill_type) + if(length(candidate.levels) == SKILL_MAX) // find a skill with all the levels, so avoid perks/traits + sample_skill = candidate + break + if(!sample_skill) + sample_skill = GET_DECL(/decl/skill/general/hauling) for(var/i in 1 to length(max_choices)) var/choices = max_choices[i] if(!choices) continue var/list/level_data = list() - level_data["name"] = skill.levels[i] + level_data["name"] = sample_skill.levels[i] level_data["level"] = i var/selected = LAZYACCESS(currently_selected, i) level_data["selected"] = list() diff --git a/code/modules/mob/stripping.dm b/code/modules/mob/stripping.dm index 18b1ccb45e94..0856c8617870 100644 --- a/code/modules/mob/stripping.dm +++ b/code/modules/mob/stripping.dm @@ -47,7 +47,7 @@ visible_message(SPAN_NOTICE("\The [user] [sensor.get_sensors_locked() ? "" : "un"]locks \the [src]'s vitals sensor controls."), range = 2) return if("internals") - visible_message("\The [usr] is trying to set \the [src]'s internals!") + visible_message("\The [user] is trying to set \the [src]'s internals!") if(do_after(user, HUMAN_STRIP_DELAY, src, progress = 0)) toggle_internals(user) return diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index a462eff5ba09..ec0dcd39482f 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -115,9 +115,9 @@ if(length(cards)) LAZYDISTINCTADD(., cards) -/obj/item/holder/attack_self() +/obj/item/holder/attack_self(mob/user) for(var/mob/M in contents) - M.show_stripping_window(usr) + M.show_stripping_window(user) /obj/item/holder/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index 68257d94e532..af9339b6a132 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -151,7 +151,7 @@ module.show_assignments = 1 if("print") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer.has_component(PART_PRINTER)) //This option should never be called if there is no printer if(module.mod_mode) @@ -175,7 +175,7 @@ contents += " [get_access_desc(A)]" if(!computer.print_paper(contents,"access report")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return else var/contents = {"

Crew Manifest

@@ -183,7 +183,7 @@ [html_crew_manifest()] "} if(!computer.print_paper(contents, "crew manifest ([stationtime2text()])")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return if("eject") var/obj/item/stock_parts/computer/card_slot/card_slot = computer.get_component(PART_CARD) @@ -193,7 +193,7 @@ card_slot.insert_id(user.get_active_held_item(), user) if("terminate") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) id_card.assignment = "Terminated" @@ -201,7 +201,7 @@ RAISE_EVENT(/decl/observ/employee_id_terminated, id_card) if("edit") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) var/static/regex/hash_check = regex(@"^[0-9a-fA-F]{32}$") @@ -212,7 +212,7 @@ id_card.formal_name_suffix = initial(id_card.formal_name_suffix) id_card.formal_name_prefix = initial(id_card.formal_name_prefix) else - computer.show_error(usr, "Invalid name entered!") + computer.show_error(user, "Invalid name entered!") else if(href_list["account"]) var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) id_card.associated_account_number = account_num @@ -243,11 +243,11 @@ if(!isnull(sug_blood_type) && CanUseTopic(user)) id_card.blood_type = sug_blood_type else if(href_list["front_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.front = photo else if(href_list["side_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.side = photo else if(href_list["load_data"]) @@ -275,7 +275,7 @@ apply_access(id_card, access) if("assign") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer && id_card) var/t1 = href_list["assign_target"] diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 8d9a59feacfe..fbb4c292e2c5 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -62,7 +62,7 @@ data["message_line1"] = msg_line1 data["message_line2"] = msg_line2 data["state"] = current_status - data["isAI"] = issilicon(usr) + data["isAI"] = issilicon(user) data["authenticated"] = is_authenticated(user) data["boss_short"] = global.using_map.boss_short @@ -153,17 +153,17 @@ current_status = text2num(href_list["target"]) if("announce") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(user) var/obj/item/card/id/id_card = user.GetIdCard() crew_announcement.announcer = GetNameAndAssignmentFromId(id_card) else crew_announcement.announcer = "Unknown" if(announcment_cooldown) - to_chat(usr, "Please allow at least one minute to pass between announcements.") + to_chat(user, "Please allow at least one minute to pass between announcements.") return TRUE - var/input = input(usr, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = input(user, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 var/affected_zlevels = SSmapping.get_connected_levels(get_host_z()) crew_announcement.Announce(input, zlevels = affected_zlevels) @@ -174,35 +174,35 @@ . = 1 if(href_list["target"] == "emagged") if(program) - if(is_authenticated(user) && program.computer.emagged() && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && program.computer.emagged() && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return - var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = sanitize(input(user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Syndicate_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an illegal announcement: [input]") + Syndicate_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an illegal announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 else if(href_list["target"] == "regular") - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. - to_chat(usr, "No emergency communication relay detected. Unable to transmit message.") + to_chat(user, "No emergency communication relay detected. Unable to transmit message.") return 1 var/input = sanitize(input("Please choose a message to transmit to [global.using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Centcomm_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an IA [global.using_map.boss_short] announcement: [input]") + Centcomm_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an IA [global.using_map.boss_short] announcement: [input]") centcomm_message_cooldown = 1 spawn(300) //30 second cooldown centcomm_message_cooldown = 0 @@ -241,7 +241,7 @@ post_status(href_list["target"]) if("setalert") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_cont && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_cont && ntn_comm) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) var/decl/security_level/target_level = locate(href_list["target"]) in security_state.comm_console_security_levels if(target_level && security_state.can_switch_to(target_level)) @@ -250,7 +250,7 @@ if(security_state.set_security_level(target_level)) SSstatistics.add_field(target_level.type,1) else - to_chat(usr, "You press the button, but a red light flashes and nothing happens.") //This should never happen + to_chat(user, "You press the button, but a red light flashes and nothing happens.") //This should never happen current_status = STATE_DEFAULT if("viewmessage") @@ -270,13 +270,13 @@ . = 1 if(is_authenticated(user) && ntn_comm) if(!program.computer.print_paper(current_viewing_message["contents"],current_viewing_message["title"])) - to_chat(usr, "Hardware Error: Printer was unable to print the selected file.") + to_chat(user, "Hardware Error: Printer was unable to print the selected file.") if("unbolt_doors") global.using_map.unbolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") if("bolt_doors") global.using_map.bolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms bolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms bolted.") #undef STATE_DEFAULT #undef STATE_MESSAGELIST @@ -365,7 +365,7 @@ var/global/last_message_id = 0 if(isnull(emergency)) emergency = 1 - if(!global.universe.OnShuttleCall(usr)) + if(!global.universe.OnShuttleCall(user)) to_chat(user, "Cannot establish a connection.") return diff --git a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm index 0a0dd383145f..0b111c2306ae 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm @@ -119,7 +119,7 @@ return TOPIC_HANDLED var/new_roles = global.all_mainframe_roles - M.roles if(!length(new_roles)) - to_chat(usr, SPAN_WARNING("This server already has all possible roles enabled.")) + to_chat(user, SPAN_WARNING("This server already has all possible roles enabled.")) return TOPIC_HANDLED var/role = input(user,"What role to enable on this server?") as null|anything in new_roles if(role && CanUseTopic(user, state)) @@ -132,7 +132,7 @@ if(!istype(M)) return TOPIC_HANDLED if(!length(M.roles)) - to_chat(usr, SPAN_WARNING("This server has no enabled roles to remove.")) + to_chat(user, SPAN_WARNING("This server has no enabled roles to remove.")) return TOPIC_HANDLED var/role = input(user,"What role to disable on this server?") as null|anything in M.roles if(role && CanUseTopic(user, state)) diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm index 4d79e385dd3a..0305f32e421a 100644 --- a/code/modules/modular_computers/file_system/programs/generic/records.dm +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -163,7 +163,7 @@ var/obj/item/photo/photo = user.get_active_held_item() return photo.img if(issilicon(user)) - var/mob/living/silicon/tempAI = usr + var/mob/living/silicon/tempAI = user var/obj/item/photo/selection = tempAI.GetPicture() if (selection) return selection.img diff --git a/code/modules/modular_computers/file_system/programs/generic/reports.dm b/code/modules/modular_computers/file_system/programs/generic/reports.dm index 4897bd583853..a88753fdd88f 100644 --- a/code/modules/modular_computers/file_system/programs/generic/reports.dm +++ b/code/modules/modular_computers/file_system/programs/generic/reports.dm @@ -141,7 +141,7 @@ return 1 var/field_ID = text2num(href_list["ID"]) var/datum/report_field/field = selected_report.field_from_ID(field_ID) - if(!field || !(field.get_perms(get_access(usr), usr) & OS_WRITE_ACCESS)) + if(!field || !(field.get_perms(get_access(user), user) & OS_WRITE_ACCESS)) return 1 field.ask_value(user) //Handles the remaining IO. return 1 diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index de61e09ddfd8..64fc7f971be5 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -16,7 +16,7 @@ to_chat(user, "***** DIAGNOSTICS REPORT *****") to_chat(user, jointext(diagnostics(), "\n")) to_chat(user, "******************************") - return 1 + return TRUE return ..() /obj/item/stock_parts/computer/on_install(obj/machinery/machine) diff --git a/code/modules/modular_computers/hardware/lan_port.dm b/code/modules/modular_computers/hardware/lan_port.dm index cde307de70df..1c0701880ef5 100644 --- a/code/modules/modular_computers/hardware/lan_port.dm +++ b/code/modules/modular_computers/hardware/lan_port.dm @@ -67,7 +67,7 @@ var/turf/T = get_turf(parent) if(check_terminal_block(T)) to_chat(user, SPAN_WARNING("There's already a network cable there!")) - return FALSE + return TRUE if(istype(T) && !T.is_plating()) to_chat(user, SPAN_WARNING("You must remove the floor plating beneath \the [parent] first.")) return TRUE diff --git a/code/modules/modular_computers/networking/machinery/acl.dm b/code/modules/modular_computers/networking/machinery/acl.dm index 566d6e178162..7fe16ac83c03 100644 --- a/code/modules/modular_computers/networking/machinery/acl.dm +++ b/code/modules/modular_computers/networking/machinery/acl.dm @@ -32,14 +32,14 @@ if(href_list["back"]) current_group = null return TOPIC_REFRESH - + if(href_list["create_group"]) - var/group_name = sanitize_for_group(input(usr, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) + var/group_name = sanitize_for_group(input(user, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) if(!length(group_name)) return TOPIC_HANDLED if(!CanInteract(user, global.default_topic_state)) return TOPIC_REFRESH - + var/output = D.add_group(group_name, current_group) if(group_name in D.all_groups) to_chat(user, SPAN_NOTICE(output)) @@ -59,15 +59,15 @@ else to_chat(user, SPAN_NOTICE(output)) return TOPIC_REFRESH - + if(href_list["toggle_submanagement"]) D.toggle_submanagement() return TOPIC_REFRESH - + if(href_list["toggle_parent_account_creation"]) D.toggle_parent_account_creation() return TOPIC_REFRESH - + if(href_list["view_child_groups"]) var/parent_group = href_list["view_child_groups"] if(parent_group && (parent_group in D.group_dict)) @@ -75,7 +75,7 @@ else current_group = null return TOPIC_REFRESH - + if(href_list["info"]) switch(href_list["info"]) if("submanagement") diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index 59ec11f651eb..e619be1904ff 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -61,7 +61,7 @@ . = min(., extension_status(user)) // Handles user's GUI input -/datum/extension/interactive/os/extension_act(href, href_list, user) +/datum/extension/interactive/os/extension_act(href, href_list, mob/user) if( href_list["PC_exit"] ) kill_program(active_program) return TOPIC_HANDLED @@ -94,7 +94,7 @@ system_shutdown() return TOPIC_HANDLED if( href_list["PC_minimize"] ) - minimize_program(usr) + minimize_program(user) return TOPIC_HANDLED if( href_list["PC_killprogram"] ) @@ -105,7 +105,7 @@ kill_program(P) update_uis() - to_chat(usr, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") + to_chat(user, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") return TOPIC_HANDLED if( href_list["PC_runprogram"] ) @@ -117,15 +117,15 @@ return TOPIC_REFRESH if( href_list["PC_terminal"] ) - open_terminal(usr) + open_terminal(user) return TOPIC_HANDLED if( href_list["PC_login"]) - login_prompt(usr) + login_prompt(user) return TOPIC_REFRESH if( href_list["PC_logout"]) - logout_account(usr) + logout_account(user) return TOPIC_REFRESH /datum/extension/interactive/os/proc/regular_ui_update() diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 1968e2ec7a0c..0a82703bd07d 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -259,7 +259,7 @@ if(connecting_limb.organ_tag == parent_organ) if(length(connecting_limb.children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) return TRUE var/mob/holder = loc @@ -282,7 +282,7 @@ else if(connecting_limb.parent_organ == organ_tag) if(LAZYLEN(children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) return TRUE if(!user.try_unequip(connecting_limb, src)) diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index d1c38e68b5be..0d185bbe9ae9 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -89,7 +89,7 @@ if(laser) created_wound = createwound(LASER, burn) if(prob(40)) - owner.IgniteMob() + owner.ignite_fire() else created_wound = createwound(BURN, burn) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index ed9e91407341..7c7c5b2e24e8 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -21,9 +21,7 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_surgery_overlay_icon() if(limb_flags & ORGAN_FLAG_SKELETAL) return null - if(BP_IS_PROSTHETIC(src)) - return null - return species?.get_surgery_overlay_icon(owner) + return bodytype?.get_surgery_overlay_icon(owner) /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/human/human) _icon_cache_key = null diff --git a/code/modules/organs/internal/species/golem.dm b/code/modules/organs/internal/species/golem.dm index 93e368c2e646..cbf569bebab9 100644 --- a/code/modules/organs/internal/species/golem.dm +++ b/code/modules/organs/internal/species/golem.dm @@ -1,8 +1,9 @@ /obj/item/organ/internal/brain/golem name = "chem" desc = "A tightly furled roll of paper, covered with indecipherable runes." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/items/paperwork/scroll.dmi' icon_state = "scroll" + color = COLOR_BEIGE /obj/item/organ/internal/brain/golem/can_recover() - return 0 + return FALSE diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 955161ad681c..c52321e2f2f1 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -37,6 +37,9 @@ /// Set to true if this organ should return info to Stat(). See get_stat_info(). var/has_stat_info +/obj/item/organ/proc/reset_matter() + matter = null + /obj/item/organ/Destroy() if(owner) owner.remove_organ(src, FALSE, FALSE, TRUE, TRUE, FALSE) //Tell our parent we're unisntalling in place @@ -141,9 +144,16 @@ max_damage *= bodytype.hardiness min_broken_damage *= bodytype.hardiness bodytype.resize_organ(src) - set_material(override_material || bodytype.material) - matter = bodytype.matter?.Copy() + + reset_matter() + set_material(override_material || bodytype.organ_material) + for(var/mat in bodytype.matter) + if(mat in matter) + matter[mat] += bodytype.matter[mat] + else + LAZYSET(matter, mat, bodytype.matter[mat]) create_matter() + // maybe this should be a generalized repopulate_reagents helper?? if(reagents) reagents.clear_reagents() diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/organ_prosthetics.dm similarity index 100% rename from code/modules/organs/prosthetics/_prosthetics.dm rename to code/modules/organs/organ_prosthetics.dm diff --git a/code/modules/overmap/internet/internet_uplink.dm b/code/modules/overmap/internet/internet_uplink.dm index 337e9b075898..cd38e4509feb 100644 --- a/code/modules/overmap/internet/internet_uplink.dm +++ b/code/modules/overmap/internet/internet_uplink.dm @@ -181,7 +181,7 @@ var/global/list/internet_uplinks = list() return ..() -/obj/machinery/computer/internet_uplink/interface_interact(user) +/obj/machinery/computer/internet_uplink/interface_interact(mob/user) var/datum/extension/local_network_member/uplink_comp = get_extension(src, /datum/extension/local_network_member) var/datum/local_network/lan = uplink_comp.get_local_network() @@ -193,5 +193,5 @@ var/global/list/internet_uplinks = list() return FALSE var/datum/topic_state/remote/R = new(src, linked) - linked.ui_interact(usr, state = R) + linked.ui_interact(user, state = R) return TRUE \ No newline at end of file diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index ce08d9c7b59a..6543aebddfc0 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -42,8 +42,8 @@ if(length(port_choices)) port = input("Choose shuttle docking port:", "Shuttle Docking Port") as null|anything in port_choices else - to_chat(usr, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) - if(CanInteract(usr, global.default_topic_state) && (port in port_choices)) + to_chat(user, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) + if(CanInteract(user, global.default_topic_state) && (port in port_choices)) shuttle.set_port(port_choices[port]) if(href_list["pick"]) var/list/possible_d = shuttle.get_possible_destinations() @@ -51,9 +51,9 @@ if(possible_d.len) D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d else - to_chat(usr, SPAN_WARNING("No valid landing sites in range.")) + to_chat(user, SPAN_WARNING("No valid landing sites in range.")) possible_d = shuttle.get_possible_destinations() - if(CanInteract(usr, global.default_topic_state) && (D in possible_d)) + if(CanInteract(user, global.default_topic_state) && (D in possible_d)) shuttle.set_destination(possible_d[D]) return TOPIC_REFRESH if(href_list["manual_landing"]) @@ -68,7 +68,7 @@ else start_landing(user, shuttle) return TOPIC_REFRESH - to_chat(usr, SPAN_WARNING("The manual controls look hopelessly complex to you!")) + to_chat(user, SPAN_WARNING("The manual controls look hopelessly complex to you!")) /obj/machinery/computer/shuttle_control/explore/proc/start_landing(var/mob/user, var/datum/shuttle/autodock/overmap/shuttle) var/obj/effect/overmap/visitable/current_sector = global.overmap_sectors[num2text(z)] diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index ee1e92dd890d..d25c1d6cbe50 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -111,7 +111,7 @@ user.set_machine(src) show_browser(user, dat, "window=[initial(name)]") onclose(user, initial(name)) - add_fingerprint(usr) + add_fingerprint(user) return /obj/item/clipboard/proc/add_pen(var/obj/item/I, var/mob/user) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cdcbe7b3444e..a5008f8e2256 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -44,7 +44,7 @@ else if(IS_PEN(W)) updateUsrDialog() - var/n_name = sanitize_safe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) + var/n_name = sanitize_safe(input(user, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) if(!CanPhysicallyInteractWith(user, src)) to_chat(user, SPAN_WARNING("You must stay close to \the [src].")) return TRUE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b5beaeb8400d..92a37e75a1be 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -332,7 +332,7 @@ var/pen_flags = I.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) if(!(pen_flags & PEN_FLAG_ACTIVE)) - parch.toggle_active(usr, I) + parch.toggle_active(user, I) var/iscrayon = pen_flags & PEN_FLAG_CRAYON var/isfancy = pen_flags & PEN_FLAG_FANCY diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index 8587007f8d91..7c7e69565c3a 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -84,7 +84,7 @@ /obj/item/sticky_pad/random/Initialize() . = ..() - color = pick(COLOR_YELLOW, COLOR_LIME, COLOR_CYAN, COLOR_ORANGE, COLOR_PINK) + set_color(pick(COLOR_YELLOW, COLOR_LIME, COLOR_CYAN, COLOR_ORANGE, COLOR_PINK)) //////////////////////////////////////////////// // Sticky Note Sheet diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 5d900aab3575..70b9b4c453d3 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -129,7 +129,7 @@ //Dump all stored papers too for(var/i=1 to amount) var/obj/item/paper/P = new /obj/item/paper(forced_loc) - P.merge_with_existing(forced_loc, usr) + P.merge_with_existing(forced_loc, user) LAZYCLEARLIST(papers) /obj/item/paper_bin/proc/add_paper(var/obj/item/paper/P) diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index b4bfb68c3a97..0c3222998ac1 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -18,7 +18,7 @@ /obj/item/pen/crayon/Initialize() . = ..() if(use_stroke_color) - color = stroke_color + set_color(stroke_color) /obj/item/pen/crayon/make_pen_description() desc = "A colourful [stroke_color_name] [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index 3c7bda42989b..7cfeaa96c43d 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -63,15 +63,13 @@ if(toner) to_chat(user, SPAN_WARNING("There is already \a [W] in \the [src]!")) return TRUE - else - return insert_toner(W, user) + return insert_toner(W, user) else if(istype(W, /obj/item/paper) || istype(W, /obj/item/paper_bundle)) if(paper_left >= paper_max) to_chat(user, SPAN_WARNING("There is no more room for paper in \the [src]!")) return TRUE - else - return insert_paper(W, user) + return insert_paper(W, user) . = ..() /obj/item/stock_parts/printer/attack_hand(mob/user) diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index fc2a819e8b2b..0c9e0aedca6b 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -63,9 +63,8 @@ else return - . = GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens) - if(.) - CreateEntryInstance(., tokens) + if(GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens)) + return CreateEntryInstance(., tokens) /decl/persistence_handler/proc/IsValidEntry(var/atom/entry) if(!istype(entry)) @@ -92,7 +91,7 @@ .["age"] = GetEntryAge(entry) /decl/persistence_handler/proc/FinalizeTokens(var/list/tokens) - . = tokens + . = tokens || list() /decl/persistence_handler/Initialize() diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index e55a5cc94271..479a9c8cb454 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -17,7 +17,7 @@ if(case) book.forceMove(case) case.update_icon() - . = book + return book /decl/persistence_handler/book/IsValidEntry(var/atom/entry) . = ..() diff --git a/code/modules/persistence/persistence_datum_filth.dm b/code/modules/persistence/persistence_datum_filth.dm index 53c8ac5307d1..9f877efeab0d 100644 --- a/code/modules/persistence/persistence_datum_filth.dm +++ b/code/modules/persistence/persistence_datum_filth.dm @@ -15,11 +15,16 @@ . = ..() if(.["path"] && !ispath(.["path"])) .["path"] = text2path(.["path"]) - . = tokens + if(isnull(.["filthiness"])) + .["filthiness"] = 0 /decl/persistence_handler/filth/CreateEntryInstance(var/turf/creating, var/list/tokens) var/_path = tokens["path"] - new _path(creating, tokens["age"]+1) + var/obj/effect/decal/cleanable/dirt/dirt = new _path(creating, tokens["age"]+1) + if(istype(dirt)) + dirt.dirt_amount = tokens["filthiness"] + dirt.update_icon() + return dirt /decl/persistence_handler/filth/GetEntryAge(var/atom/entry) var/obj/effect/decal/cleanable/filth = entry @@ -32,3 +37,8 @@ /decl/persistence_handler/filth/CompileEntry(var/atom/entry) . = ..() .["path"] = "[GetEntryPath(entry)]" + if(istype(entry, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = entry + .["filthiness"] = dirt.dirt_amount + else + .["filthiness"] = 0 diff --git a/code/modules/persistence/persistence_datum_graffiti.dm b/code/modules/persistence/persistence_datum_graffiti.dm index de71177f2fc1..83861418d67e 100644 --- a/code/modules/persistence/persistence_datum_graffiti.dm +++ b/code/modules/persistence/persistence_datum_graffiti.dm @@ -17,7 +17,7 @@ return TRUE /decl/persistence_handler/graffiti/CreateEntryInstance(var/turf/creating, var/list/tokens) - new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) + return new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) /decl/persistence_handler/graffiti/IsValidEntry(var/atom/entry) . = ..() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index adfe9f64ed48..dd74a49e3d3b 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -26,9 +26,10 @@ By design, d1 is the smallest direction and d2 is the highest name = "power cable" desc = "A flexible superconducting cable for heavy-duty power transfer." icon = 'icons/obj/power_cond_white.dmi' - icon_state = "0-1" - layer = EXPOSED_WIRE_LAYER - color = COLOR_MAROON + icon_state = "0-1" + layer = EXPOSED_WIRE_LAYER + color = COLOR_MAROON + paint_color = COLOR_MAROON anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED level = LEVEL_BELOW_PLATING @@ -55,24 +56,31 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/structure/cable/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/structure/cable/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/structure/cable/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/structure/cable/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/structure/cable/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/structure/cable/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/structure/cable/Initialize(var/ml) // ensure d1 & d2 reflect the icon_state for entering and exiting cable @@ -227,7 +235,7 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == UP || c.d2 == UP) qdel(c) - investigate_log("was cut by [key_name(usr, usr.client)] in [get_area_name(user)]","wires") + investigate_log("was cut by [key_name(user, user.client)] in [get_area_name(user)]","wires") qdel(src) @@ -237,7 +245,7 @@ By design, d1 is the smallest direction and d2 is the highest return 0 if (electrocute_mob(user, powernet, src, siemens_coeff)) spark_at(src, amount=5, cardinal_only = TRUE) - if(HAS_STATUS(usr, STAT_STUN)) + if(HAS_STATUS(user, STAT_STUN)) return 1 return 0 @@ -264,7 +272,7 @@ By design, d1 is the smallest direction and d2 is the highest var/color_n = "#dd0000" if(colorC) color_n = colorC - color = color_n + set_color(color_n) ///////////////////////////////////////////////// // Cable laying helpers @@ -502,6 +510,7 @@ By design, d1 is the smallest direction and d2 is the highest amount = MAXCOIL max_amount = MAXCOIL color = COLOR_MAROON + paint_color = COLOR_MAROON desc = "A coil of wiring, suitable for both delicate electronics and heavy duty power supply." singular_name = "length" w_class = ITEM_SIZE_NORMAL @@ -544,7 +553,7 @@ By design, d1 is the smallest direction and d2 is the highest TOOL_SUTURES = TOOL_QUALITY_MEDIOCRE )) if (can_have_color && param_color) // It should be red by default, so only recolor it if parameter was specified. - color = param_color + set_color(param_color) update_icon() update_wclass() @@ -569,9 +578,9 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/on_update_icon() . = ..() - if (!color && can_have_color) + if (!paint_color && can_have_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) if(amount == 1) icon_state = "coil1" SetName("cable piece") @@ -594,7 +603,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!final_color) selected_color = "Red" final_color = possible_cable_colours[selected_color] - color = final_color + set_color(final_color) to_chat(user, SPAN_NOTICE("You change \the [src]'s color to [lowertext(selected_color)].")) /obj/item/stack/cable_coil/proc/update_wclass() @@ -627,7 +636,7 @@ By design, d1 is the smallest direction and d2 is the highest to_chat(usr, SPAN_WARNING("You need at least 15 [plural_name] of cable to make restraints!")) return var/obj/item/handcuffs/cable/B = new /obj/item/handcuffs/cable(usr.loc) - B.color = color + B.set_color(color) to_chat(usr, SPAN_NOTICE("You wind some [plural_name] of cable together to make some restraints.")) else to_chat(usr, SPAN_NOTICE("You cannot do that.")) @@ -842,31 +851,39 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/item/stack/cable_coil/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/item/stack/cable_coil/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/item/stack/cable_coil/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/item/stack/cable_coil/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/item/stack/cable_coil/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/item/stack/cable_coil/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/item/stack/cable_coil/lime color = COLOR_LIME + paint_color = COLOR_LIME /obj/item/stack/cable_coil/random/Initialize(mapload, c_length, param_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) . = ..() // Produces cable coil from a rig power cell. diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 94e4bebfba43..e3b47f5c5d10 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -329,8 +329,8 @@ var/prot = FALSE var/mob/living/human/H = user if(istype(H)) - var/obj/item/clothing/gloves/pronouns = H.get_equipped_item(slot_gloves_str) - if(istype(pronouns) && pronouns.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + var/obj/item/clothing/gloves/gloves = H.get_equipped_item(slot_gloves_str) + if(istype(gloves) && gloves.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) prot = TRUE if(prot > 0 || user.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) @@ -482,7 +482,7 @@ /obj/item/light/set_color(color) b_color = isnull(color) ? COLOR_WHITE : color - update_icon() + queue_icon_update() // avoid running update_icon before Initialize /obj/item/light/tube name = "light tube" @@ -552,7 +552,6 @@ // update the icon state and description of the light /obj/item/light/on_update_icon() . = ..() - color = b_color var/broken switch(status) if(LIGHT_OK) @@ -565,9 +564,7 @@ icon_state = "[base_state]_broken" desc = "A broken [name]." broken = TRUE - var/image/I = image(icon, src, "[base_state]_attachment[broken ? "_broken" : ""]") - I.color = null - add_overlay(I) + add_overlay(overlay_image(icon, "[base_state]_attachment[broken ? "_broken" : ""]", flags = RESET_COLOR|RESET_ALPHA)) /obj/item/light/Initialize(mapload) . = ..() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index ae7a1bc6e423..431439981132 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -76,9 +76,9 @@ if(distance > 1) return if(active) - to_chat(usr, "The generator is on.") + to_chat(user, "The generator is on.") else - to_chat(usr, "The generator is off.") + to_chat(user, "The generator is off.") /obj/machinery/port_gen/emp_act(severity) if(!active) return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d7ae1df1a1ad..233b66d985f9 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -67,8 +67,8 @@ if(active==1) active = 0 to_chat(user, "You turn off \the [src].") - log_and_message_admins("turned off \the [src]") - investigate_log("turned off by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned off \the [src]", user) + investigate_log("turned off by [key_name_admin(user)]","singulo") else active = 1 if(user) @@ -77,8 +77,8 @@ to_chat(user, "You turn on \the [src].") shot_number = 0 fire_delay = get_initial_fire_delay() - log_and_message_admins("turned on \the [src]") - investigate_log("turned on by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned on \the [src]", user) + investigate_log("turned on by [key_name_admin(user)]","singulo") update_icon() else to_chat(user, "The controls are locked!") diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 6ad9f2fbc7fb..50c22d1479ea 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -221,8 +221,8 @@ return TRUE /obj/machinery/power/smes/attackby(var/obj/item/W, var/mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return return bash(W, user) /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 3a956c49e00d..59665f270cb1 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -155,7 +155,7 @@ var/obj/item/clothing/gloves/G = h_user.get_equipped_item(slot_gloves_str) if(istype(G) && G.siemens_coefficient == 0) user_protected = 1 - log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") + log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [user.ckey], Intensity: [intensity]/100 - JMP") switch (intensity) if (0 to 15) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8fb0064ca709..aa6c612f55b0 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -185,7 +185,7 @@ /obj/machinery/turbine/OnTopic(user, href_list) if(href_list["close"]) - close_browser(usr, "window=turbine") + close_browser(user, "window=turbine") return TOPIC_HANDLED if(href_list["str"]) @@ -244,9 +244,9 @@ -/obj/machinery/computer/turbine_computer/OnTopic(user, href_list) +/obj/machinery/computer/turbine_computer/OnTopic(mob/user, href_list) if( href_list["view"] ) - usr.client.eye = src.compressor + user.client.eye = src.compressor . = TOPIC_HANDLED else if( href_list["str"] ) src.compressor.starter = !src.compressor.starter diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a26611bd8949..f163d0f64c76 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -167,6 +167,7 @@ return for(var/i in 1 to initial_ammo) stored_ammo += new ammo_type(src) + contents_initialized = TRUE /obj/item/ammo_magazine/proc/get_stored_ammo_count() . = length(stored_ammo) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 1224485b346f..29125e7db811 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -18,14 +18,16 @@ /obj/item/ammo_magazine/speedloader/on_update_icon() . = ..() - if(!length(stored_ammo)) + var/ammo_count = get_stored_ammo_count() + if(!ammo_count) return + create_initial_contents() // Not ideal, but we need instances for the icon gen. switch(icon_state) if("world") var/ammo_state = "world-some" - if(length(stored_ammo) == 1) + if(ammo_count == 1) ammo_state = "world-one" - else if(length(stored_ammo) == max_ammo) + else if(ammo_count == max_ammo) ammo_state = "world-full" var/obj/item/ammo_casing/A = stored_ammo[1] add_overlay(overlay_image(icon, ammo_state, A.color, RESET_COLOR)) diff --git a/code/modules/projectiles/guns/energy/capacitor.dm b/code/modules/projectiles/guns/energy/capacitor.dm index 38d3f62f52e5..1232ef3e8f39 100644 --- a/code/modules/projectiles/guns/energy/capacitor.dm +++ b/code/modules/projectiles/guns/energy/capacitor.dm @@ -250,7 +250,7 @@ var/global/list/laser_wavelengths if(charged) var/obj/item/projectile/P = new projectile_type(src) - P.color = selected_wavelength.color + P.set_color(selected_wavelength.color) P.set_light(l_color = selected_wavelength.light_color) P.damage = floor(sqrt(total_charge) * selected_wavelength.damage_multiplier) P.armor_penetration = floor(sqrt(total_charge) * selected_wavelength.armour_multiplier) diff --git a/code/modules/projectiles/guns/energy/staves.dm b/code/modules/projectiles/guns/energy/staves.dm index 45ab5f71b6f3..965c8f208e07 100644 --- a/code/modules/projectiles/guns/energy/staves.dm +++ b/code/modules/projectiles/guns/energy/staves.dm @@ -13,15 +13,13 @@ self_recharge = 1 charge_meter = 0 has_safety = FALSE - var/required_antag_type = /decl/special_role/wizard + var/required_antag_type /obj/item/gun/energy/staff/special_check(var/mob/user) - if(required_antag_type) - var/decl/special_role/antag = GET_DECL(required_antag_type) - if(user.mind && !antag.is_antagonist(user.mind)) - to_chat(usr, "You focus your mind on \the [src], but nothing happens!") - return 0 - + var/decl/special_role/antag = GET_DECL(required_antag_type) + if(user.mind && (!antag?.is_antagonist(user.mind))) + to_chat(user, SPAN_WARNING("You focus your mind on \the [src], but nothing happens!")) + return FALSE return ..() /obj/item/gun/energy/staff/handle_click_empty(mob/user = null) diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index ee2bc15639bf..d8d3d2e48bd8 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -32,7 +32,7 @@ to_chat(user, "[rockets.len] / [max_rockets] rockets.") return TRUE else - to_chat(usr, "\The [src] cannot hold more rockets.") + to_chat(user, "\The [src] cannot hold more rockets.") return TRUE return ..() diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index a34c5d36ae99..6c00e6c25942 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -151,13 +151,13 @@ else if (href_list["eject"]) var/index = text2num(href_list["eject"]) if(beakers[index]) - remove_beaker(beakers[index], usr) + remove_beaker(beakers[index], user) . = TOPIC_REFRESH else if (href_list["eject_cart"]) - unload_ammo(usr) + unload_ammo(user) . = TOPIC_REFRESH - Interact(usr) + Interact(user) /obj/item/gun/projectile/dartgun/medical starting_chems = list(/decl/material/liquid/burn_meds,/decl/material/liquid/brute_meds,/decl/material/liquid/antitoxins) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d9cde61e7df9..dc643dcdc3b2 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -354,9 +354,9 @@ ..() if(isliving(target)) var/mob/living/L = target - L.adjust_fire_stacks(rand(2,4)) - if(L.fire_stacks >= 3) - L.IgniteMob() + L.adjust_fire_intensity(rand(2,4)) + if(L.get_fire_intensity() >= 3) + L.ignite_fire() /obj/item/projectile/beam/pop icon_state = "bluelaser" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 014041095106..d648f6d70c3f 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -206,5 +206,5 @@ if(isliving(target)) var/mob/living/L = target to_chat(target, SPAN_WARNING("You feel a wave of heat wash over you!")) - L.adjust_fire_stacks(rand(5,8)) - L.IgniteMob() \ No newline at end of file + L.adjust_fire_intensity(rand(5,8)) + L.ignite_fire() \ No newline at end of file diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm index eeaf61909deb..082471448a5c 100644 --- a/code/modules/projectiles/targeting/targeting_client.dm +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -1,12 +1,11 @@ //These are called by the on-screen buttons, adjusting what the victim can and cannot do. /client/proc/add_gun_icons() - if(!usr || !usr.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen |= usr.item_use_icon - screen |= usr.gun_move_icon - screen |= usr.radio_use_icon + if(!mob.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. + screen |= mob.item_use_icon + screen |= mob.gun_move_icon + screen |= mob.radio_use_icon /client/proc/remove_gun_icons() - if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG - screen -= usr.item_use_icon - screen -= usr.gun_move_icon - screen -= usr.radio_use_icon + screen -= mob.item_use_icon + screen -= mob.gun_move_icon + screen -= mob.radio_use_icon diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 4357110ccbb1..d35715d884ad 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -815,12 +815,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new target.remove_cleanables() if(dirtiness != DIRTINESS_NEUTRAL) if(dirtiness > DIRTINESS_NEUTRAL) - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate() in target - if (!dirtoverlay) - dirtoverlay = new /obj/effect/decal/cleanable/dirt(target) - dirtoverlay.alpha = total_volume * dirtiness - else - dirtoverlay.alpha = min(dirtoverlay.alpha + total_volume * dirtiness, 255) + target.add_dirt(ceil(total_volume * dirtiness)) else if(dirtiness <= DIRTINESS_STERILE) target.germ_level -= min(total_volume*20, target.germ_level) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index eaac5570598d..0216e31ad13a 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -254,7 +254,7 @@ spawn() has_sprites += user.client for(var/i = 1 to MAX_PILL_SPRITE) - send_rsc(usr, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") + send_rsc(user, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") var/dat = list() dat += "[name]" dat += "[name] Menu:" diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 77c2b2c99d0c..ba069e72a232 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -9,6 +9,7 @@ nutriment_factor = 0 hydration_factor = 6 affect_blood_on_ingest = FALSE + affect_blood_on_inhale = FALSE var/adj_dizzy = 0 // Per tick var/adj_drowsy = 0 diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 802b96c79929..3ac879172e79 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -12,6 +12,8 @@ fishing_bait_value = 0.65 compost_value = 1 nutriment_factor = 10 + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 // Technically a room-temperature solid, but saves // repathing it to /solid all over the codebase. diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index ab55f5dd9753..62f5d50a7e32 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -48,13 +48,14 @@ else if(user) to_chat(user, SPAN_NOTICE("You clear the label on \the [src].")) -/obj/item/chems/chem_disp_cartridge/attack_self() - ..() +/obj/item/chems/chem_disp_cartridge/attack_self(mob/user) + if((. = ..())) + return if (ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the cap on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the cap on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the cap off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the cap off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/chem_disp_cartridge/afterattack(obj/target, mob/user, proximity_flag, click_parameters) diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2126b561d77..528b85dbcbce 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -151,7 +151,7 @@ name = "Condensed Capsaicin" minimum_temperature = 100 CELSIUS maximum_temperature = 200 CELSIUS // To avoid cooking chili creating condensed capsaicin. - mix_message = "darkens and thickens as it seperates from its water content" + mix_message = "darkens and thickens as it separates from its water content" required_reagents = list(/decl/material/liquid/capsaicin = 2) result = list(/decl/material/liquid/capsaicin/condensed = 1) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 49d66cb0af70..a39da55a863c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -43,10 +43,10 @@ /obj/item/chems/proc/cannot_interact(mob/user) if(!CanPhysicallyInteract(user)) - to_chat(usr, SPAN_WARNING("You're in no condition to do that!")) + to_chat(user, SPAN_WARNING("You're in no condition to do that!")) return TRUE if(ismob(loc) && loc != user) - to_chat(usr, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) + to_chat(user, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) return TRUE return FALSE diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 258146c77c42..b593c3f968f3 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -65,6 +65,7 @@ take_damage(rand(4,8)) /obj/item/chems/glass/beaker/large + name_prefix = "large" name = "beaker" // see update_name override below desc = "A large beaker." icon = 'icons/obj/items/chem/beakers/large.dmi' @@ -74,10 +75,6 @@ possible_transfer_amounts = @"[5,10,15,25,30,60,120]" w_class = ITEM_SIZE_LARGE -/obj/item/chems/glass/beaker/large/update_name() - . = ..() - SetName("large [name]") // large glass beaker, not glass large beaker - /obj/item/chems/glass/beaker/bowl name = "mixing bowl" desc = "A large mixing bowl." diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6e69142d458c..06147c369b40 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -100,14 +100,14 @@ return -/obj/item/chems/borghypo/OnTopic(var/href, var/list/href_list) +/obj/item/chems/borghypo/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["reagent_index"]) var/index = text2num(href_list["reagent_index"]) if(index > 0 && index <= reagent_ids.len) playsound(loc, 'sound/effects/pop.ogg', 50, 0) mode = index var/decl/material/R = reagent_ids[mode] - to_chat(usr, "Synthesizer is now producing '[initial(R.name)]'.") + to_chat(user, "Synthesizer is now producing '[initial(R.name)]'.") return TOPIC_REFRESH /obj/item/chems/borghypo/examine(mob/user, distance) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 6c93e2c79a27..242cd0583bec 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -41,7 +41,7 @@ /obj/item/chems/drinks/bottle/proc/smash_check(var/distance) if(!material?.is_brittle()) return 0 - if(rag && rag.on_fire) // Molotovs should be somewhat reliable, they're a pain to make. + if(rag?.is_on_fire()) // Molotovs should be somewhat reliable, they're a pain to make. return TRUE if(!smash_duration) return 0 @@ -68,13 +68,13 @@ if(rag) rag.dropInto(T) while(T) + if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) + break rag.forceMove(T) - if(rag.on_fire) + if(rag.is_on_fire()) T.hotspot_expose(700, 5) for(var/mob/living/M in T.contents) - M.IgniteMob() - if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) - break + M.ignite_fire() T = GetBelow(T) rag = null @@ -148,7 +148,7 @@ . = ..() underlays.Cut() if(rag) - var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) + var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.is_on_fire()? "[rag_underlay]_lit" : rag_underlay) underlays += underlay_image set_light(rag.light_range, 0.1, rag.light_color) else @@ -178,8 +178,8 @@ if(reagents) user.visible_message(SPAN_NOTICE("The contents of \the [src] splash all over [target]!")) reagents.splash(target, reagents.total_volume) - if(rag && rag.on_fire && istype(target)) - target.IgniteMob() + if(rag?.is_on_fire() && istype(target)) + target.ignite_fire() //Finally, smash the bottle. This kills (qdel) the bottle. var/obj/item/broken_bottle/B = smash(target.loc, target) diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index bf707313e556..ea7851b65edc 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -39,10 +39,10 @@ var/clr = W.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR_NAME) if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, SPAN_WARNING("The egg refuses to take on this color!")) + to_chat(user, SPAN_WARNING("The egg refuses to take on this color!")) return TRUE - to_chat(usr, SPAN_NOTICE("You color \the [src] [clr]")) + to_chat(user, SPAN_NOTICE("You color \the [src] [clr]")) icon_state = "egg-[clr]" return TRUE return ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index d120bce478c9..64e7fb66199b 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -56,14 +56,14 @@ /obj/item/chems/glass/proc/can_lid() return TRUE -/obj/item/chems/glass/attack_self() +/obj/item/chems/glass/attack_self(mob/user) . = ..() if(!. && can_lid()) if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the lid on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the lid on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the lid off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the lid off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER update_icon() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2df686595f83..711c448ebdd3 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -85,7 +85,7 @@ /obj/item/chems/spray/attack_self(var/mob/user) if(has_safety()) - toggle_safety() + toggle_safety(user) return TRUE else //If no safety, we just toggle the nozzle @@ -98,9 +98,9 @@ /obj/item/chems/spray/proc/has_safety() return FALSE -/obj/item/chems/spray/proc/toggle_safety() +/obj/item/chems/spray/proc/toggle_safety(mob/user) safety = !safety - to_chat(usr, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) + to_chat(user, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) /obj/item/chems/spray/examine(mob/user, distance) . = ..() diff --git a/code/modules/research/design_database_analyzer.dm b/code/modules/research/design_database_analyzer.dm index 8d7b7f259a37..6750ea55a043 100644 --- a/code/modules/research/design_database_analyzer.dm +++ b/code/modules/research/design_database_analyzer.dm @@ -89,8 +89,8 @@ if(busy) to_chat(user, SPAN_WARNING("\The [src] is busy right now.")) return TRUE - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(isrobot(user)) return TRUE if(loaded_item) diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 250691aa2a62..4a546c0241f5 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -41,14 +41,14 @@ if(istype(S) && !S.diffused_for && !S.disabled_for && cell.checked_use(10 KILOWATTS * CELLRATE)) S.diffuse(20) -/obj/item/shield_diffuser/attack_self() +/obj/item/shield_diffuser/attack_self(mob/user) enabled = !enabled update_icon() if(enabled) START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) - to_chat(usr, "You turn \the [src] [enabled ? "on" : "off"].") + to_chat(user, "You turn \the [src] [enabled ? "on" : "off"].") /obj/item/shield_diffuser/examine(mob/user) . = ..() diff --git a/code/modules/shuttles/docking_beacon.dm b/code/modules/shuttles/docking_beacon.dm index 8c0f64d87b1f..bac4e5fe16a1 100644 --- a/code/modules/shuttles/docking_beacon.dm +++ b/code/modules/shuttles/docking_beacon.dm @@ -94,7 +94,7 @@ if(href_list["edit_codes"]) var/newcode = sanitize(input("Input new docking codes:", "Docking codes", docking_codes) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newcode) docking_codes = uppertext(newcode) @@ -103,7 +103,7 @@ if(href_list["edit_display_name"]) var/newname = sanitize(input("Input new display name:", "Display name", display_name) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newname) display_name = newname @@ -114,7 +114,7 @@ if(href_list["edit_size"]) var/newwidth = input("Input new docking width for beacon:", "Docking size", docking_width) as num|null var/newheight = input("Input new docking height for beacon:", "Docking size", docking_height) as num|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newwidth && newheight) docking_width = clamp(newwidth, 0, MAX_DOCKING_SIZE) @@ -134,7 +134,7 @@ return TOPIC_REFRESH if(href_list["edit_permitted_shuttles"]) - var/shuttle = sanitize(input(usr,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) + var/shuttle = sanitize(input(user,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) if(shuttle) if(shuttle in permitted_shuttles) permitted_shuttles -= shuttle @@ -166,7 +166,7 @@ if(href_list["change_color"]) var/new_color = input(user, "Choose a color.", "\the [src]", ship_color) as color|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(new_color && new_color != ship_color) ship_color = new_color @@ -175,7 +175,7 @@ if(href_list["change_ship_name"]) var/new_ship_name = sanitize(input(user, "Enter a new name for the ship:", "Change ship name.") as null|text) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(!new_ship_name) return TOPIC_HANDLED @@ -195,7 +195,7 @@ if(!construction_mode) return TOPIC_HANDLED var/confirm = alert(user, "This will permanently finalize the ship, are you sure?", "Ship finalization", "No", "Yes") - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(confirm == "Yes") if(create_ship()) @@ -203,7 +203,7 @@ ship_name = "" LAZYCLEARLIST(errors) else - to_chat(usr, SPAN_WARNING("Could not finalize the construction of the ship!")) + to_chat(user, SPAN_WARNING("Could not finalize the construction of the ship!")) return TOPIC_REFRESH /obj/machinery/docking_beacon/proc/allow_projection() diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 67337ab8fe25..422e33e3f0e1 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -89,7 +89,7 @@ if(href_list["set_codes"]) var/newcode = input("Input new docking codes", "Docking codes", shuttle.docking_codes) as text|null - if (newcode && CanInteract(usr, global.default_topic_state)) + if (newcode && CanInteract(user, global.default_topic_state)) shuttle.set_docking_codes(uppertext(newcode)) return TOPIC_REFRESH diff --git a/code/modules/shuttles/shuttle_console_multi.dm b/code/modules/shuttles/shuttle_console_multi.dm index c55dcc37721a..28f8805a36d4 100644 --- a/code/modules/shuttles/shuttle_console_multi.dm +++ b/code/modules/shuttles/shuttle_console_multi.dm @@ -9,14 +9,14 @@ "can_pick" = shuttle.moving_status == SHUTTLE_IDLE, ) -/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list) +/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list, var/user) if((. = ..()) != null) return if(href_list["pick"]) var/dest_key = input("Choose shuttle destination", "Shuttle Destination") as null|anything in shuttle.get_destinations() - if(dest_key && CanInteract(usr, global.default_topic_state)) - shuttle.set_destination(dest_key, usr) + if(dest_key && CanInteract(user, global.default_topic_state)) + shuttle.set_destination(dest_key, user) return TOPIC_REFRESH diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm deleted file mode 100644 index 709f5d38ffe9..000000000000 --- a/code/modules/species/outsider/shadow.dm +++ /dev/null @@ -1,48 +0,0 @@ -/decl/bodytype/starlight/shadow - name = "shadow" - desc = "A wound of darkness inflicted upon the world." - icon_base = 'icons/mob/human_races/species/shadow/body.dmi' - icon_deformed = 'icons/mob/human_races/species/shadow/body.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - eye_darksight_range = 8 - uid = "bodytype_starlight_shadow" - -/decl/blood_type/shadowstuff - name = "shadowstuff" - antigen_category = "shadowstuff" - splatter_name = "shadowstuff" - splatter_desc = "A puddle of shadowstuff." - splatter_colour = COLOR_GRAY80 - -/decl/species/starlight/shadow - name = "Shadow" - name_plural = "shadows" - description = "A being of pure darkness, hates the light and all that comes with it." - butchery_data = null - - available_bodytypes = list(/decl/bodytype/starlight/shadow) - - unarmed_attacks = list(/decl/natural_attack/claws/strong, /decl/natural_attack/bite/sharp) - shock_vulnerability = 0 - - blood_types = list( - /decl/blood_type/shadowstuff - ) - flesh_color = "#aaaaaa" - - remains_type = /obj/effect/decal/cleanable/ash - death_message = "dissolves into ash..." - - species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED - -/decl/species/starlight/shadow/handle_environment_special(var/mob/living/human/H) - if(H.is_in_stasis() || H.stat == DEAD || H.isSynthetic()) - return - var/light_amount = 0 - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > 2) //if there's enough light, start dying - H.take_overall_damage(1,1) - else //heal in the dark - H.heal_overall_damage(1,1) \ No newline at end of file diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm deleted file mode 100644 index 215ba3cf5e9e..000000000000 --- a/code/modules/species/outsider/starlight.dm +++ /dev/null @@ -1,153 +0,0 @@ -/decl/species/starlight - abstract_type = /decl/species/starlight - butchery_data = null - spawn_flags = SPECIES_IS_RESTRICTED - available_pronouns = list(/decl/pronouns/neuter) - force_background_info = list( - /decl/background_category/heritage = /decl/background_detail/heritage/other - ) - hidden_from_codex = TRUE - -/decl/bodytype/starlight - abstract_type = /decl/bodytype/starlight - has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable), - BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable) - ) - has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/starlight - ) - -/obj/item/organ/internal/brain/starlight - name = "essence of fire" - desc = "A fancy name for ash. Still, it does look a bit different from the regular stuff." - icon = 'icons/obj/objects.dmi' - icon_state = "ash" - -/decl/bodytype/starlight/starborn - name = "starborn" - desc = "A blazing mass of light." - icon_base = 'icons/mob/human_races/species/starborn/body.dmi' - icon_deformed = 'icons/mob/human_races/species/starborn/body.dmi' - husk_icon = 'icons/mob/human_races/species/starborn/husk.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - uid = "bodytype_starlight_starborn" - cold_level_1 = 260 - cold_level_2 = 250 - cold_level_3 = 235 - heat_level_1 = 20000 - heat_level_2 = 30000 - heat_level_3 = 40000 - cold_discomfort_level = 300 - cold_discomfort_strings = list( - "You feel your fire dying out...", - "Your fire begins to shrink away from the cold.", - "You feel slow and sluggish from the cold." - ) - heat_discomfort_level = 10000 - heat_discomfort_strings = list( - "Surprisingly, you start burning!", - "You're... burning!?!" - ) - -/decl/blood_type/starstuff - name = "starstuff" - antigen_category = "starstuff" - splatter_name = "starstuff" - splatter_desc = "A puddle of starstuff." - splatter_colour = "#ffff00" - -/decl/species/starlight/handle_death(var/mob/living/human/H) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) - -/decl/species/starlight/starborn - name = "Starborn" - name_plural = "Starborn" - description = "Beings of fire and light, split off from a sun deity of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/starborn) - - blood_types = list( - /decl/blood_type/starstuff - ) - flesh_color = "#ffff00" - - unarmed_attacks = list(/decl/natural_attack/punch/starborn) - - warning_low_pressure = 50 - hazard_low_pressure = 0 - shock_vulnerability = 0 - hunger_factor = 0 - thirst_factor = 0 - death_message = "dissolves into pure flames!" - breath_type = null - - - total_health = 250 - body_temperature = T0C + 500 //We are being of fire and light. - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - - base_auras = list( - /obj/aura/starborn - ) - -/decl/species/starlight/starborn/handle_death(var/mob/living/human/H) - ..() - var/turf/T = get_turf(H) - T.add_to_reagents(/decl/material/liquid/fuel, 20) - T.hotspot_expose(FLAMMABLE_GAS_MINIMUM_BURN_TEMPERATURE) - -/decl/bodytype/starlight/blueforged - name = "blueforged" - desc = "A mass of carved and shaped spacetime." - icon_base = 'icons/mob/human_races/species/blueforged/body.dmi' - icon_deformed = 'icons/mob/human_races/species/blueforged/body.dmi' - eye_icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - override_organ_types = list(BP_EYES = /obj/item/organ/internal/eyes/blueforged) - uid = "bodytype_starlight_blueforged" - -/decl/blood_type/spacestuff - name = "spacestuff" - antigen_category = "spacestuff" - splatter_name = "spacestuff" - splatter_desc = "A puddle of spacestuff." - splatter_colour = "#2222ff" - -/decl/species/starlight/blueforged - name = "Blueforged" - name_plural = "Blueforged" - description = "Living chunks of spacetime, carved out of the original dimension and given life by a being of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/blueforged) - - flesh_color = "#2222ff" - - warning_low_pressure = 50 - hazard_low_pressure = 0 - hunger_factor = 0 - thirst_factor = 0 - breath_type = null - - burn_mod = 10 - brute_mod = 0 - oxy_mod = 0 - toxins_mod = 0 - radiation_mod = 0 - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - -/decl/species/starlight/blueforged/handle_death(var/mob/living/human/H) - ..() - new /obj/effect/temporary(get_turf(H),11, 'icons/mob/mob.dmi', "liquify") - -/obj/item/organ/internal/eyes/blueforged - name = "bluespace prism" - desc = "You can see an endless blue plane when looking through it. Your eyes tingle if you stare too hard." - icon = 'icons/mob/human_races/species/blueforged/organs.dmi' diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 90b97759adc3..f2e3abce8458 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -19,9 +19,6 @@ /decl/species/proc/get_vision_flags(var/mob/living/human/H) return vision_flags -/decl/species/proc/get_surgery_overlay_icon(var/mob/living/human/H) - return 'icons/mob/surgery.dmi' - /decl/species/proc/get_footstep(var/mob/living/human/H, var/footstep_type) return diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm index 9c3e4d00f154..a1ee2815579f 100644 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ b/code/modules/species/species_shapeshifter_bodytypes.dm @@ -5,7 +5,7 @@ /decl/bodytype/shapeshifter/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) applying.MapColors("#4d4d4d","#969696","#1c1c1c", "#000000") - applying.SetIntensity(limb_icon_intensity) + applying = ..() applying += rgb(,,,180) // Makes the icon translucent, SO INTUITIVE TY BYOND return applying @@ -38,7 +38,8 @@ /decl/bodytype/shapeshifter/get_icon_cache_uid(var/mob/H) . = ..() if(H) - . = "[.]-[wrapped_species_by_ref["\ref[H]"]]" + var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) + if(S) return S.default_bodytype.get_icon_cache_uid(H) /decl/bodytype/shapeshifter/apply_bodytype_organ_modifications(obj/item/organ/org) ..() diff --git a/code/modules/species/station/human_bodytypes.dm b/code/modules/species/station/human_bodytypes.dm index be6879a20a49..b6c753b55143 100644 --- a/code/modules/species/station/human_bodytypes.dm +++ b/code/modules/species/station/human_bodytypes.dm @@ -8,7 +8,7 @@ bandages_icon = 'icons/mob/bandage.dmi' limb_icon_intensity = 0.7 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") appearance_flags = HAS_SKIN_TONE_NORMAL | HAS_UNDERWEAR | HAS_EYE_COLOR nail_noun = "nails" uid = "bodytype_human_fem" diff --git a/code/modules/spells/aoe_turf/aoe_turf.dm b/code/modules/spells/aoe_turf/aoe_turf.dm index 46febbfbe5fd..0f7a721de803 100644 --- a/code/modules/spells/aoe_turf/aoe_turf.dm +++ b/code/modules/spells/aoe_turf/aoe_turf.dm @@ -1,7 +1,7 @@ /* Aoe turf spells target a ring of tiles around the user This ring has an outer radius (range) and an inner radius (inner_radius) -Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are explained in setup.dm +Aoe turf spells have a useful flag: IGNOREDENSE. It is explained in setup.dm */ /spell/aoe_turf //affects all turfs in view or range (depends) @@ -15,8 +15,6 @@ Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are ex if(!(target in view_or_range(inner_radius, holder, selection_type))) if(target.density && (spell_flags & IGNOREDENSE)) continue - if(isspaceturf(target) && (spell_flags & IGNORESPACE)) - continue targets += target if(!targets.len) //doesn't waste the spell diff --git a/code/modules/spells/aoe_turf/blink.dm b/code/modules/spells/aoe_turf/blink.dm deleted file mode 100644 index 3fd742aec243..000000000000 --- a/code/modules/spells/aoe_turf/blink.dm +++ /dev/null @@ -1,44 +0,0 @@ -/spell/aoe_turf/blink - name = "Blink" - desc = "This spell randomly teleports you a short distance." - feedback = "BL" - school = "conjuration" - charge_max = 20 - spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE - invocation = "none" - invocation_type = SpI_NONE - range = 7 - inner_radius = 1 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 4) - cooldown_min = 5 //4 deciseconds reduction per rank - hud_state = "wiz_blink" - cast_sound = 'sound/magic/blink.ogg' - -/spell/aoe_turf/blink/cast(var/list/targets, mob/user) - if(!targets.len) - return - - var/turf/T = pick(targets) - var/turf/starting = get_turf(user) - if(T) - if(user.buckled) - user.buckled = null - user.forceMove(T) - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(3, 0, starting) - smoke.start() - - smoke = new() - smoke.set_up(3, 0, T) - smoke.start() - - return - -/spell/aoe_turf/blink/empower_spell() - if(!..()) - return 0 - inner_radius += 1 - - return "You've increased the inner range of [src]." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/charge.dm b/code/modules/spells/aoe_turf/charge.dm deleted file mode 100644 index d9c8f95af90a..000000000000 --- a/code/modules/spells/aoe_turf/charge.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/charge - name = "Charge" - desc = "This spell can be used to charge up spent magical artifacts, among other things." - - school = "transmutation" - charge_max = 600 - spell_flags = 0 - invocation = "DIRI CEL" - invocation_type = SpI_WHISPER - range = 0 - cooldown_min = 400 //50 deciseconds reduction per rank - - hud_state = "wiz_charge" - cast_sound = 'sound/magic/charge.ogg' - -/spell/aoe_turf/charge/cast(var/list/targets, mob/user) - for(var/turf/T in targets) - depth_cast(T) - -/spell/aoe_turf/charge/proc/depth_cast(var/list/targets) - for(var/atom/A in targets) - if(A.contents.len) - depth_cast(A.contents) - cast_charge(A) - -/spell/aoe_turf/charge/proc/mob_charge(var/mob/living/M) - if(!M.mind) - return - if(M.mind.learned_spells.len != 0) - for(var/spell/S in M.mind.learned_spells) - if(!istype(S, /spell/aoe_turf/charge)) - S.charge_counter = S.charge_max - to_chat(M, "You feel raw magic flowing through you, it feels good!") - else - to_chat(M, "You feel very strange for a moment, but then it passes.") - return M - -/spell/aoe_turf/charge/proc/cast_charge(var/atom/target) - var/atom/charged_item - - if(isliving(target)) - charged_item = mob_charge(target) - - if(istype(target, /obj/item/grab)) - var/obj/item/grab/grab = target - if(grab.affecting) - var/mob/M = grab.get_affecting_mob() - if(M) - charged_item = mob_charge(M) - - if(istype(target, /obj/item/cell/)) - var/obj/item/cell/C = target - if(prob(80) && C.maxcharge) - C.maxcharge -= 200 - if(C.maxcharge <= 0) //maxcharge of 0! Madness! - C.maxcharge = 0 - C.charge = C.maxcharge - charged_item = C - - if(!charged_item) - return 0 - else - charged_item.visible_message("[charged_item] suddenly sparks with energy!") - return 1 - - -/spell/aoe_turf/charge/blood - name = "Blood Infusion" - desc = "This spell charges things around it using the lifeforce gained by sacrificed blood." - charge_type = Sp_HOLDVAR - holder_var_type = "bruteloss" - holder_var_amount = 30 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm index 9291456f41a6..8dd91146310c 100644 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ b/code/modules/spells/aoe_turf/conjure/conjure.dm @@ -20,7 +20,7 @@ How they spawn stuff is decided by behaviour vars, which are explained below var/summon_exclusive = 0 //spawn one of everything, instead of random things var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example + //should have format of list("emagged" = 1,"name" = "Justicebot"), for example cast_sound = 'sound/magic/castsummon.ogg' @@ -38,9 +38,6 @@ How they spawn stuff is decided by behaviour vars, which are explained below else summoned_object_type = pick(summon_type) var/turf/spawn_place = pick(targets) - if(spell_flags & IGNOREPREV) - targets -= spawn_place - var/atom/summoned_object if(ispath(summoned_object_type,/turf)) spawn_place.ChangeTurf(summoned_object_type) diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm deleted file mode 100644 index e6f0b8ea2607..000000000000 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ /dev/null @@ -1,113 +0,0 @@ -/spell/aoe_turf/conjure/summon - var/name_summon = 0 - cast_sound = 'sound/weapons/wave.ogg' - -/spell/aoe_turf/conjure/summon/before_cast() - ..() - if(name_summon) - var/newName = sanitize(input("Would you like to name your summon?") as null|text, MAX_NAME_LEN) - if(newName) - newVars["name"] = newName - -/spell/aoe_turf/conjure/summon/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) - animation.icon_state = "shield2" - flick("shield2",animation) - sleep(10) - ..() - - -/spell/aoe_turf/conjure/summon/bats - name = "Summon Space Bats" - desc = "This spell summons a flock of spooky space bats." - feedback = "SB" - - charge_max = 1200 //2 minutes - spell_flags = NEEDSCLOTHES - invocation = "Bla'yo daya!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 600 - - range = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/scarybat) - - hud_state = "wiz_bats" - -/spell/aoe_turf/conjure/summon/bats/empower_spell() - if(!..()) - return 0 - - newVars = list("max_health" = 20 + spell_levels[Sp_POWER]*5, "health" = 20 + spell_levels[Sp_POWER]*5, "melee_damage_lower" = 10 + spell_levels[Sp_POWER], "melee_damage_upper" = 10 + spell_levels[Sp_POWER]*2) - - return "Your bats are now stronger." - -/spell/aoe_turf/conjure/summon/bear - name = "Summon Bear" - desc = "This spell summons a permanent bear companion that will follow your orders." - feedback = "BR" - charge_max = 3000 //5 minutes because this is a REALLY powerful spell. May tone it down/up. - spell_flags = NEEDSCLOTHES - invocation = "REA'YO GOR DAYA!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 0, Sp_POWER = 4) - - range = 0 - - name_summon = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("max_health" = 15, - "health" = 15, - "melee_damage_lower" = 10, - "melee_damage_upper" = 10, - ) - - hud_state = "wiz_bear" - -/spell/aoe_turf/conjure/summon/bear/apply_vars(atom/summoned_object, mob/caster) - . = ..() - if(isliving(summoned_object)) - var/mob/living/summoned_mob = summoned_object - if(istype(summoned_mob.ai, /datum/mob_controller/aggressive/commanded)) - var/datum/mob_controller/aggressive/commanded/command_ai = summoned_mob.ai - command_ai.master = caster - -/spell/aoe_turf/conjure/summon/bear/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - newVars = list("max_health" = 30, - "health" = 30, - "melee_damage_lower" = 15, - "melee_damage_upper" = 15 - ) - return "Your bear has been upgraded from a cub to a whelp." - if(2) - newVars = list("max_health" = 45, - "health" = 45, - "melee_damage_lower" = 20, - "melee_damage_upper" = 20, - "color" = "#d9d9d9" //basically we want them to look different enough that people can recognize it. - ) - return "Your bear has been upgraded from a whelp to an adult." - if(3) - newVars = list("max_health" = 60, - "health" = 60, - "melee_damage_lower" = 25, - "melee_damage_upper" = 25, - "color" = "#8c8c8c" - ) - return "Your bear has been upgraded from an adult to an alpha." - if(4) - newVars = list("max_health" = 75, - "health" = 75, - "melee_damage_lower" = 35, - "melee_damage_upper" = 35, - "resistance" = 3, - "color" = "#0099ff" - ) - return "Your bear is now worshiped as a god amongst bears." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm deleted file mode 100644 index 4511e6a07f46..000000000000 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ /dev/null @@ -1,28 +0,0 @@ -/spell/aoe_turf/conjure/faithful_hound - name = "Faithful Hound" - desc = "Summon a spectral watchdog with a special password. Anyone without the password is in for a barking and a biting." - feedback = "FH" - - charge_max = 600 - spell_flags = NEEDSCLOTHES - invocation = "Du korilath tangus" - invocation_type = SpI_WHISPER - range = 0 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/faithful_hound) - hud_state = "wiz_hound" - - var/temp_password - -/spell/aoe_turf/conjure/faithful_hound/apply_vars(atom/summoned_object, mob/caster) - . = ..() - var/mob/living/simple_animal/faithful_hound/hound = summoned_object - if(istype(hound) && istype(hound.ai)) - hound.ai.add_friend(caster) - hound.ai.memorise(caster, temp_password) - temp_password = null - -/spell/aoe_turf/conjure/faithful_hound/before_cast() - ..() - temp_password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm deleted file mode 100644 index 293e176051f1..000000000000 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ /dev/null @@ -1,12 +0,0 @@ -/spell/aoe_turf/conjure/force_portal - name = "Force Portal" - desc = "Create a portal that sucks in anything that touches it and then shoots it all out at the end." - school = "conjuration" - feedback = "FP" - summon_type = list(/obj/effect/force_portal) - charge_max = 200 - spell_flags = NEEDSCLOTHES - range = 0 - cast_sound = null - - hud_state = "wiz_force" diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm deleted file mode 100644 index 1c937f3f6d8c..000000000000 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/aoe_turf/conjure/forcewall - name = "Forcewall" - desc = "Create a wall of pure energy at your location." - school = "conjuration" - feedback = "FW" - summon_type = list(/obj/effect/forcefield) - duration = 300 - charge_max = 100 - spell_flags = 0 - range = 0 - cast_sound = 'sound/magic/forcewall.ogg' - - hud_state = "wiz_shield" - -/spell/aoe_turf/conjure/forcewall/mime - name = "Invisible wall" - desc = "Create an invisible wall on your location." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = SpI_EMOTE - invocation = "mimes placing their hands on a flat surfacing, and pushing against it." - charge_max = 300 - cast_sound = null - - override_base = "grey" - hud_state = "mime_wall" - -/obj/effect/forcefield - desc = "A space wizard's magic wall." - name = "FORCEWALL" - icon = 'icons/effects/effects.dmi' - icon_state = "m_shield" - anchored = TRUE - opacity = FALSE - density = TRUE - -/obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone) - var/turf/T = get_turf(src.loc) - if(T) - for(var/mob/M in T) - Proj.on_hit(M,M.bullet_act(Proj, def_zone)) - return - -/obj/effect/forcefield/mime - icon_state = "empty" - name = "invisible wall" - desc = "You have a bad feeling about this." diff --git a/code/modules/spells/aoe_turf/conjure/grove.dm b/code/modules/spells/aoe_turf/conjure/grove.dm deleted file mode 100644 index 77f68981e9db..000000000000 --- a/code/modules/spells/aoe_turf/conjure/grove.dm +++ /dev/null @@ -1,75 +0,0 @@ -/spell/aoe_turf/conjure/grove - name = "Grove" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - charge_max = 1200 - school = "transmutation" - - range = 1 - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - summon_amt = 47 - summon_type = list(/turf/floor/fake_grass) - var/spread = 0 - var/datum/seed/seed - var/seed_type = /datum/seed/merlin_tear - cast_sound = 'sound/magic/repulse.ogg' - -/spell/aoe_turf/conjure/grove/New() - ..() - if(seed_type) - seed = new seed_type() - else - seed = SSplants.create_random_seed(1) - -/spell/aoe_turf/conjure/grove/before_cast() - var/turf/T = get_turf(holder) - var/obj/effect/vine/P = new(T,seed) - P.spread_chance = spread - - -/spell/aoe_turf/conjure/grove/sanctuary - name = "Sanctuary" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - feedback = "SY" - invocation = "Bo K'Iitan!" - invocation_type = SpI_SHOUT - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - seed_type = /datum/seed/merlin_tear - newVars = list("name" = "sanctuary", "desc" = "This grass makes you feel comfortable. Peaceful.","blessed" = 1) - - hud_state = "wiz_grove" -/spell/aoe_turf/conjure/grove/sanctuary/empower_spell() - if(!..()) - return 0 - - seed.set_trait(TRAIT_SPREAD,2) //make it grow. - spread = 40 - return "Your sanctuary will now grow beyond that of the grassy perimeter." - -/datum/seed/merlin_tear - name = "merlin tears" - product_name = "merlin tears" - display_name = "merlin tears" - chems = list(/decl/material/liquid/brute_meds = list(3,7), /decl/material/liquid/burn_meds = list(3,7), /decl/material/liquid/antitoxins = list(3,7), /decl/material/liquid/regenerator = list(3,7), /decl/material/liquid/neuroannealer = list(1,2), /decl/material/liquid/eyedrops = list(1,2)) - grown_tag = "berries" - -/datum/seed/merlin_tear/New() - ..() - set_trait(TRAIT_PLANT_ICON,"bush5") - set_trait(TRAIT_PRODUCT_ICON,"berry") - set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - set_trait(TRAIT_PLANT_COLOUR, "#ff6600") - set_trait(TRAIT_YIELD,4) - set_trait(TRAIT_MATURATION,6) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_IMMUTABLE,1) //no making op plants pls \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm deleted file mode 100644 index d9912e1c3907..000000000000 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ /dev/null @@ -1,33 +0,0 @@ -/spell/aoe_turf/disable_tech - name = "Disable Tech" - desc = "This spell disables all weapons, cameras and most other technology in range." - feedback = "DT" - charge_max = 400 - spell_flags = NEEDSCLOTHES - invocation = "NEC CANTIO" - invocation_type = SpI_SHOUT - selection_type = "range" - range = 0 - inner_radius = -1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 200 //50 deciseconds reduction per rank - - var/emp_heavy = 3 - var/emp_light = 5 - - hud_state = "wiz_tech" - cast_sound = 'sound/magic/disable_tech.ogg' - -/spell/aoe_turf/disable_tech/cast(list/targets) - - for(var/turf/target in targets) - empulse(get_turf(target), emp_heavy, emp_light) - return - -/spell/aoe_turf/disable_tech/empower_spell() - if(!..()) - return 0 - emp_heavy += 2 - emp_light += 2 - - return "You've increased the range of [src]." diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm deleted file mode 100644 index 8ad4ea6b8a29..000000000000 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/aoe_turf/drain_blood - name = "Drain Blood" - desc = "This spell allows the caster to borrow blood from those around them. Sharing is caring!" - feedback = "DB" - school = "transmutation" - charge_max = 600 - invocation = "whispers something darkly" - invocation_type = SpI_EMOTE - range = 3 - inner_radius = 0 - - time_between_channels = 100 - number_of_channels = 3 - cast_sound = 'sound/effects/squelch2.ogg' - hud_state = "const_rune" - -/spell/aoe_turf/drain_blood/cast(var/list/targets, var/mob/user) - for(var/t in targets) - for(var/mob/living/L in t) - if(L.stat == DEAD || L == user) - continue - //Hurt target - if(ishuman(L)) - var/mob/living/human/H = L - H.vessel.remove_any(10) - else - L.take_damage(10) - to_chat(L, "You feel your lifeforce being ripping out of your body!") - - //Do effect - var/obj/item/projectile/beam/blood_effect/effect = new(get_turf(user)) - effect.pixel_x = 0 - effect.pixel_y = 0 - effect.launch(L, "chest") - - //Heal self - if(ishuman(user)) - var/mob/living/human/H = user - var/amount = min(10, H.species.blood_volume - H.vessel.total_volume) - if(amount > 0) - H.adjust_blood(amount) - continue - L.heal_damage(BRUTE, 5, do_update_health = FALSE) - L.heal_damage(BURN, 2.5, do_update_health = FALSE) - L.heal_damage(TOX, 2.5) - -/obj/item/projectile/beam/blood_effect - name = "blood jet" - icon_state = "blood" - damage = 0 - randpixel = 0 - no_attack_log = 1 - muzzle_type = /obj/effect/projectile/blood - tracer_type = /obj/effect/projectile/blood - impact_type = /obj/effect/projectile/blood - -/obj/item/projectile/beam/blood_effect/Bump(var/atom/a, forced=0) - if(a == original) - on_impact(a) - qdel(src) - return 1 - return 0 - - -/obj/effect/projectile/blood - icon_state = "blood" \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/exchange_wounds.dm b/code/modules/spells/aoe_turf/exchange_wounds.dm deleted file mode 100644 index 7293e960d292..000000000000 --- a/code/modules/spells/aoe_turf/exchange_wounds.dm +++ /dev/null @@ -1,43 +0,0 @@ -/spell/aoe_turf/exchange_wounds - name = "Exchange Wounds" - desc = "Allows you to sacrifice your own well-being for that of those around you." - feedback = "EW" - school = "transmutation" - invocation = "Esh Yek Vai!" - invocation_type = SpI_SHOUT - charge_max = 400 - spell_flags = 0 - - var/amt_healed = 0 - var/heal_max = 100 - range = 4 - inner_radius = 0 - number_of_channels = 0 - time_between_channels = 20 - - hud_state = "wiz_exchange" - -/spell/aoe_turf/exchange_wounds/perform() - amt_healed = 0 - ..() - -/spell/aoe_turf/exchange_wounds/cast(var/list/targets, var/mob/living/user) - new /obj/effect/temporary(get_turf(user),10,'icons/effects/effects.dmi',"purple_electricity_constant") - for(var/t in targets) - for(var/mob/living/L in t) - if(L.faction != user.faction) - continue - new /obj/effect/temporary(get_turf(L),10,'icons/effects/effects.dmi',"green_sparkles") - if(L.get_damage(BRUTE) > 5) - L.heal_damage(BRUTE, 5) - user.take_damage(2) - amt_healed += 5 - if(L.get_damage(BURN) > 5) - L.heal_damage(BURN, 5) - user.take_damage(2, BURN) - amt_healed += 5 - -/spell/aoe_turf/exchange_wounds/check_valid_targets() - if(amt_healed > heal_max) - return FALSE - return ..() \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm deleted file mode 100644 index 3cf8614eeaa7..000000000000 --- a/code/modules/spells/aoe_turf/knock.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and does not require wizard garb." - feedback = "KN" - school = "transmutation" - charge_max = 100 - spell_flags = 0 - invocation = "Aulie Oxin Fiera." - invocation_type = SpI_WHISPER - range = 3 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 20 //20 deciseconds reduction per rank - - hud_state = "wiz_knock" - cast_sound = 'sound/magic/knock.ogg' - -/spell/aoe_turf/knock/cast(list/targets) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - spawn(1) - if(istype(door,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = door //casting is important - AL.locked = 0 - door.open() - return - - -/spell/aoe_turf/knock/empower_spell() - if(!..()) - return 0 - range *= 2 - - return "You've doubled the range of [src]." - -/spell/aoe_turf/knock/slow - charge_max = 200 - hidden_from_codex = TRUE diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm deleted file mode 100644 index f9f0138908fb..000000000000 --- a/code/modules/spells/aoe_turf/smoke.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/aoe_turf/smoke - name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - feedback = "SM" - school = "transmutation" - charge_max = 120 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 1 - inner_radius = -1 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 2) - cooldown_min = 20 //25 deciseconds reduction per rank - - smoke_spread = 2 - smoke_amt = 5 - - hud_state = "wiz_smoke" - cast_sound = 'sound/magic/smoke.ogg' - -/spell/aoe_turf/smoke/empower_spell() - if(!..()) - return 0 - smoke_amt += 2 - - return "[src] will now create more smoke." diff --git a/code/modules/spells/aoe_turf/summons.dm b/code/modules/spells/aoe_turf/summons.dm deleted file mode 100644 index be61819d9eab..000000000000 --- a/code/modules/spells/aoe_turf/summons.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/conjure/summonEdSwarm //test purposes - name = "Dispense Wizard Justice" - desc = "This spell dispenses wizard justice." - - summon_type = list(/mob/living/bot/secbot/ed209) - summon_amt = 10 - range = 3 - newVars = list("emagged" = 1,"name" = "Wizard's Justicebot") - - hud_state = "wiz_ed" - -/spell/aoe_turf/conjure/carp - name = "Summon Carp" - desc = "This spell conjures a simple carp." - - school = "conjuration" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhumm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - -/spell/aoe_turf/conjure/creature - name = "Summon Creature Swarm" - desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" - - school = "conjuration" - charge_max = 1200 - spell_flags = 0 - invocation = "Ia-Ia! Naomesnalia!" - invocation_type = SpI_SHOUT - summon_amt = 10 - range = 3 - - summon_type = list(/mob/living/simple_animal/hostile/creature) - - hud_state = "wiz_creature" - -/spell/aoe_turf/conjure/mirage - name = "Summon Mirage" - desc = "This spell summons a harmless carp mirage for a few seconds." - feedback = "MR" - school = "illusion" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhunhm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - duration = 600 - cooldown_min = 600 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 2, Sp_POWER = 3) - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - - newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0) - -/spell/aoe_turf/conjure/mirage/empower_spell() - if(!..()) - return 0 - - summon_amt++ - - return "You now summon [summon_amt] mirages per spellcast." \ No newline at end of file diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm deleted file mode 100644 index 2c085ff8e2a5..000000000000 --- a/code/modules/spells/artifacts.dm +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////Scrying orb////////////////////// - -/obj/item/scrying - name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - throw_speed = 3 - throw_range = 7 - atom_damage_type = BURN - hitsound = 'sound/magic/forcewall.ogg' - max_health = ITEM_HEALTH_NO_DAMAGE - _base_attack_force = 10 - -/obj/item/scrying/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, "You stare into the orb and see nothing but your own reflection.") - return - - to_chat(user, "You can see... everything!") // This never actually happens. - visible_message("[user] stares into [src], their eyes glazing over.") - - user.teleop = user.ghostize() - announce_ghost_joinleave(user.teleop, 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") - return - - - -/////////////////////////Cursed Dice/////////////////////////// -/obj/item/dice/d20/cursed - desc = "A dice with twenty sides said to have an ill effect on those that are unlucky..." - -/obj/item/dice/d20/cursed/attack_self(mob/user) - ..() - if(isliving(user)) - var/mob/living/M = user - if(icon_state == "[name][sides]") - M.heal_damage(BRUTE, 30) - else if(icon_state == "[name]1") - M.take_damage(30) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm deleted file mode 100644 index 6477080cfdf4..000000000000 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ /dev/null @@ -1,284 +0,0 @@ -/datum/spellbound_type - var/name = "Stuff" - var/desc = "spells n shit" - var/equipment = list() - var/spells = list() - -/datum/spellbound_type/proc/spawn_servant(var/atom/a, var/mob/master, var/mob/user) - set waitfor = 0 - var/mob/living/human/H = new(a) - H.ckey = user.ckey - H.change_appearance(APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_EYE_COLOR|APPEARANCE_HAIR|APPEARANCE_FACIAL_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SKIN) - - var/obj/item/implant/translator/natural/I = new() - I.implant_in_mob(H, BP_HEAD) - if (length(master.languages)) - var/decl/language/lang = master.languages[1] - H.add_language(lang.type) - H.set_default_language(lang.type) - I.languages[lang.name] = 1 - - modify_servant(equip_servant(H), H) - set_antag(H.mind, master) - var/name_choice = sanitize(input(H, "Choose a name. If you leave this blank, it will be defaulted to your current characters.", "Name change") as null|text, MAX_NAME_LEN) - if(name_choice) - H.SetName(name_choice) - H.real_name = name_choice - -/datum/spellbound_type/proc/equip_servant(var/mob/living/human/H) - for(var/stype in spells) - var/spell/S = new stype() - if(S.spell_flags & NEEDSCLOTHES) - S.spell_flags &= ~NEEDSCLOTHES - H.add_spell(S) - . = list() - for(var/etype in equipment) - var/obj/item/I = new etype(get_turf(H)) - if(istype(I, /obj/item/clothing)) - I.canremove = 0 - H.equip_to_slot_if_possible(I,equipment[etype],0,1,1,1) - . += I - -/datum/spellbound_type/proc/set_antag(var/datum/mind/M, var/mob/master) - return - -/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/human/H) - return - -/datum/spellbound_type/apprentice - name = "Apprentice" - desc = "Summon your trusty apprentice, equipped with their very own spellbook." - equipment = list(/obj/item/clothing/head/wizard = slot_head_str, - /obj/item/clothing/jumpsuit/lightpurple = slot_w_uniform_str, - /obj/item/clothing/shoes/sandal = slot_shoes_str, - /obj/item/staff = BP_R_HAND, - /obj/item/book/spell/apprentice = BP_L_HAND, - /obj/item/clothing/suit/wizrobe = slot_wear_suit_str) - spells = list(/spell/noclothes) - -/datum/spellbound_type/apprentice/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Wizard's Apprentice", "You are an apprentice-type Servant! You're just an ordinary Wizard-To-Be, with no special abilities, but do not need robes to cast spells. Follow your teacher's orders!") - -/datum/spellbound_type/servant - var/spiel = "You don't do anything in particular." - -/datum/spellbound_type/servant/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Spellbound Servant", "You are a [name]-type Servant! [spiel]") - -/datum/spellbound_type/servant/caretaker - name = "Caretaker" - desc = "A healer, a medic, a shoulder to cry on. This servant will heal you, even from near death." - spiel = "'The last enemy that will be destroyed is death.' You can perceive any injuries with simple sight, and heal them with the Trance spell; potentially even reversing death itself! However, this comes at a price; Trance will become increasingly harder to use as you use it, until you can use it no longer. Be cautious, and aid your Master in any way possible!" - equipment = list(/obj/item/clothing/jumpsuit/caretaker = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/caretakershoes = slot_shoes_str) - spells = list(/spell/toggle_armor/caretaker, - /spell/targeted/heal_target/touch, - /spell/aoe_turf/knock/slow, - /spell/targeted/heal_target/area/slow, - /spell/targeted/analyze, - /spell/targeted/heal_target/trance - ) - -/datum/spellbound_type/servant/champion - name = "Champion" - desc = "A knight in shining armor; a warrior, a protector, and a loyal friend." - spiel = "Your sword and armor are second to none, but you have no unique supernatural powers beyond summoning the sword to your hands. Protect your Master with your life!" - equipment = list( - /obj/item/clothing/pants/champion = slot_w_uniform_str, - /obj/item/clothing/shoes/jackboots/medievalboots = slot_shoes_str - ) - spells = list( - /spell/toggle_armor/champion, - /spell/toggle_armor/excalibur - ) - -/datum/spellbound_type/servant/familiar - name = "Familiar" - desc = "A friend! Or are they a pet? They can transform into animals, and take some particular traits from said creatures." - spiel = "This form of yours is weak in comparison to your transformed form, but that certainly won't pose a problem, considering the fact that you have an alternative. Whatever it is you can turn into, use its powers wisely and serve your Master as well as possible!" - equipment = list( - /obj/item/clothing/head/bandana/familiarband = slot_head_str, - /obj/item/clothing/pants/familiar = slot_w_uniform_str - ) - -/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/human/H) - var/familiar_type - switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) - if("Space Pike") - H.add_genetic_condition(GENE_COND_NO_BREATH) - H.add_genetic_condition(GENE_COND_SPACE_RESISTANCE) - familiar_type = /mob/living/simple_animal/hostile/carp/pike - if("Mouse") - H.verbs |= /mob/living/proc/ventcrawl - familiar_type = /mob/living/simple_animal/passive/mouse - if("Cat") - H.add_genetic_condition(GENE_COND_RUNNING) - familiar_type = /mob/living/simple_animal/passive/cat - if("Bear") - familiar_type = /mob/living/simple_animal/hostile/bear - var/spell/targeted/shapeshift/familiar/F = new() - F.possible_transformations = list(familiar_type) - H.add_spell(F) - -/datum/spellbound_type/servant/fiend - name = "Fiend" - desc = "A practitioner of dark and evil magics, almost certainly a demon, and possibly a lawyer." - spiel = "The Summoning Ritual has bound you to this world with limited access to your infernal powers; you'll have to be strategic in how you use them. Follow your Master's orders as well as you can!" - spells = list(/spell/targeted/projectile/dumbfire/fireball/firebolt, - /spell/targeted/ethereal_jaunt, - /spell/targeted/torment, - /spell/area_teleport, - /spell/hand/charges/blood_shard - ) - -/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/costume/fiendsuit = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend - else - equipment = list(/obj/item/clothing/dress/devil = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend/fem - ..() - -/datum/spellbound_type/servant/infiltrator - name = "Infiltrator" - desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." - spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" - spells = list( - /spell/toggle_armor/infil_items, - /spell/targeted/exude_pleasantness, - /spell/targeted/genetic/blind/hysteria - ) - -/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator - else - equipment = list(/obj/item/clothing/dress/white = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator/fem - ..() - -/datum/spellbound_type/servant/overseer - name = "Overseer" - desc = "A ghost, or an imaginary friend; the Overseer is immune to space and can turn invisible at a whim, but has little offensive capabilities." - spiel = "Physicality is not something you are familiar with. Indeed, injuries cannot slow you down, but you can't fight back, either! In addition to this, you can reach into the void and return the soul of a single departed crewmember via the revoke death verb, if so desired; this can even revive your Master, should they fall in combat before you do. Serve them well." - equipment = list( - /obj/item/clothing/pants/casual/blackjeans/outfit = slot_w_uniform_str, - /obj/item/clothing/suit/jacket/hoodie/grim = slot_wear_suit_str, - /obj/item/clothing/shoes/sandal/grimboots = slot_shoes_str, - /obj/item/contract/wizard/xray = BP_L_HAND, - /obj/item/contract/wizard/telepathy = BP_R_HAND - ) - spells = list( - /spell/toggle_armor/overseer, - /spell/targeted/ethereal_jaunt, - /spell/invisibility, - /spell/targeted/revoke - ) - -/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/human/H) - ..() - H.add_aura(new /obj/aura/regenerating(H)) - -/obj/effect/cleanable/spellbound - name = "strange rune" - desc = "some sort of runic symbol drawn in... crayon?" - icon = 'icons/obj/rune.dmi' - icon_state = "spellbound" - is_spawnable_type = FALSE // invalid without spell_type passed - var/datum/spellbound_type/stype - var/last_called = 0 - -/obj/effect/cleanable/spellbound/Initialize(mapload, var/spell_type) - . = ..(mapload) - stype = new spell_type() - -/obj/effect/cleanable/spellbound/attack_hand(var/mob/user) - SHOULD_CALL_PARENT(FALSE) - if(last_called > world.time) - return TRUE - last_called = world.time + 30 SECONDS - var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/wizard_familiar) - for(var/mob/observer/ghost/ghost in global.player_list) - if(G.assess_candidate(ghost,null,FALSE)) - to_chat(ghost, "[SPAN_NOTICE("A wizard is requesting a Spell-Bound Servant!")] (Join)") - return TRUE - -/obj/effect/cleanable/spellbound/CanUseTopic(var/mob) - if(isliving(mob)) - return STATUS_CLOSE - return STATUS_INTERACTIVE - -/obj/effect/cleanable/spellbound/OnTopic(var/mob/user, href_list, state) - if(href_list["master"]) - var/mob/master = locate(href_list["master"]) - stype.spawn_servant(get_turf(src),master,user) - qdel(src) - return TOPIC_HANDLED - -/obj/effect/cleanable/spellbound/Destroy() - qdel(stype) - stype = null - return ..() - -/obj/item/summoning_stone - name = "summoning stone" - desc = "a small non-descript stone of dubious origin." - icon = 'icons/obj/items/summoning_stone.dmi' - icon_state = "stone" - throw_speed = 5 - throw_range = 10 - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/stone/basalt - -/obj/item/summoning_stone/attack_self(var/mob/user) - if(isAdminLevel(user.z)) - to_chat(user, "You cannot use \the [src] here.") - return - user.set_machine(src) - interact(user) - -/obj/item/summoning_stone/interact(var/mob/user) - var/list/types = subtypesof(/datum/spellbound_type) - /datum/spellbound_type/servant - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(user.mind && !wizards.is_antagonist(user.mind)) - use_type(pick(types),user) - return - var/dat = "

Summoning Stone

Choose a companion to help you.

" - for(var/type in types) - var/datum/spellbound_type/SB = type - dat += "
[initial(SB.name)] - [initial(SB.desc)]" - show_browser(user,dat,"window=summoning") - onclose(user,"summoning") - -/obj/item/summoning_stone/proc/use_type(var/type, var/mob/user) - new /obj/effect/cleanable/spellbound(get_turf(src),type) - if(prob(20)) - var/list/base_areas = maintlocs //Have to do it this way as its a macro - var/list/pareas = base_areas.Copy() - while(pareas.len) - var/a = pick(pareas) - var/area/picked_area = pareas[a] - pareas -= a - var/list/turfs = get_area_turfs(picked_area) - for(var/t in turfs) - var/turf/T = t - if(T.density) - turfs -= T - if(turfs.len) - src.visible_message("\The [src] vanishes!") - src.forceMove(pick(turfs)) - show_browser(user, null, "window=summoning") - qdel(src) - -/obj/item/summoning_stone/OnTopic(user, href_list, state) - if(href_list["type"]) - use_type(href_list["type"],user) - return TOPIC_HANDLED \ No newline at end of file diff --git a/code/modules/spells/artifacts/storage.dm b/code/modules/spells/artifacts/storage.dm deleted file mode 100644 index 4d84cab7d3d5..000000000000 --- a/code/modules/spells/artifacts/storage.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/closet/wizard - name = "artifact closet" - desc = "a special lead lined closet used to hold artifacts of immense power." - closet_appearance = /decl/closet_appearance/alien - -/obj/structure/closet/wizard/Initialize() - . = ..() - new /obj/item/parcel(get_turf(src), null, src, "Imported straight from the Wizard Acadamy. Do not lose the contents or suffer a demerit.") - -/obj/structure/closet/wizard/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - -/obj/structure/closet/wizard/armor/WillContain() - return list( - /obj/item/clothing/shoes/sandal, - /obj/item/clothing/gloves/wizard, - /obj/item/clothing/suit/space/void/wizard, - /obj/item/clothing/head/helmet/space/void/wizard - ) - -/obj/structure/closet/wizard/scrying - name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to reconnoiter with ease. In addition, buying it will permanently grant you x-ray vision." - -/obj/structure/closet/wizard/scrying/WillContain() - return list( - /obj/item/scrying, - /obj/item/contract/wizard/xray, - ) \ No newline at end of file diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm deleted file mode 100644 index 1b6ebf527f7e..000000000000 --- a/code/modules/spells/contracts.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/contract - name = "contract" - desc = "written in the blood of some unfortunate fellow." - icon = 'icons/mob/screen/spells.dmi' - icon_state = "master_open" - material = /decl/material/solid/organic/paper - var/contract_master = null - var/list/contract_spells = list(/spell/contract/reward,/spell/contract/punish,/spell/contract/return_master) - -/obj/item/contract/attack_self(mob/user) - if(contract_master == null) - to_chat(user, "You bind the contract to your soul, making you the recipient of whatever poor fool's soul that decides to contract with you.") - contract_master = user - return - - if(contract_master == user) - to_chat(user, "You can't contract with yourself!") - return - - var/ans = alert(user,"The contract clearly states that signing this contract will bind your soul to \the [contract_master]. Are you sure you want to continue?","[src]","Yes","No") - - if(ans == "Yes") - user.visible_message("\The [user] signs the contract, their body glowing a deep yellow.") - if(!src.contract_effect(user)) - user.visible_message("\The [src] visibly rejects \the [user], erasing their signature from the line.") - return - user.visible_message("\The [src] disappears with a flash of light.") - if(contract_spells.len && isliving(contract_master)) //if it aint text its probably a mob or another user - var/mob/living/M = contract_master - for(var/spell_type in contract_spells) - M.add_spell(new spell_type(user), "const_spell_ready") - log_and_message_admins("signed their soul over to \the [contract_master] using \the [src].", user) - qdel(src) - -/obj/item/contract/proc/contract_effect(mob/user) - to_chat(user, "You've signed your soul over to \the [contract_master] and with that your unbreakable vow of servitude begins.") - return 1 - -/obj/item/contract/apprentice - name = "apprentice wizarding contract" - desc = "a wizarding school contract for those who want to sign their soul for a piece of the magic pie." - color = "#993300" - -/obj/item/contract/apprentice/contract_effect(mob/user) - if(user.mind.assigned_special_role == "Wizard's Apprentice") - to_chat(user, "You are already a wizarding apprentice!") - return 0 - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "You are a servant. You have no need of apprenticeship.") - return 0 - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.add_antagonist_mind(user.mind, 1, "Wizard's Apprentice", "You are an apprentice! Your job is to learn the wizarding arts!")) - to_chat(user, "With the signing of this paper you agree to become \the [contract_master]'s apprentice in the art of wizardry.") - return 1 - return 0 - -/obj/item/contract/wizard //contracts that involve making a deal with the Wizard Acadamy (or NON PLAYERS) - contract_master = "\improper Wizard Academy" - -/obj/item/contract/wizard/xray - name = "xray vision contract" - desc = "This contract is almost see-through..." - color = "#339900" - -/obj/item/contract/wizard/xray/contract_effect(mob/user) - ..() - if (user.add_genetic_condition(GENE_COND_XRAY)) - user.set_sight(user.sight|SEE_MOBS|SEE_OBJS|SEE_TURFS) - user.set_see_in_dark(8) - user.set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) - to_chat(user, "The walls suddenly disappear.") - return 1 - return 0 - -/obj/item/contract/wizard/telepathy - name = "telepathy contract" - desc = "The edges of the contract grow blurry when you look away from them. To be fair, actually reading it gives you a headache." - color = "#fcc605" - -/obj/item/contract/wizard/telepathy/contract_effect(mob/user) - ..() - return user.add_genetic_condition(GENE_COND_REMOTE_TALK) - -/obj/item/contract/boon - name = "boon contract" - desc = "this contract grants you a boon for signing it." - var/path - -/obj/item/contract/boon/Initialize(mapload, var/new_path) - . = ..(mapload) - if(new_path) - path = new_path - var/item_name = "" - if(ispath(path,/obj)) - var/obj/O = path - item_name = initial(O.name) - else if(ispath(path,/spell)) - var/spell/S = path - item_name = initial(S.name) - name = "[item_name] contract" - -/obj/item/contract/boon/contract_effect(mob/user) - ..() - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "As a servant you find yourself unable to use this contract.") - return 0 - if(ispath(path,/spell)) - user.add_spell(new path) - return 1 - else if(ispath(path,/obj)) - new path(get_turf(user.loc)) - playsound(get_turf(usr),'sound/magic/charge.ogg',50,1) - return 1 - -/obj/item/contract/boon/wizard - contract_master = "\improper Wizard Academy" - -/obj/item/contract/boon/wizard/fireball - path = /spell/targeted/projectile/dumbfire/fireball - desc = "This contract feels warm to the touch." - -/obj/item/contract/boon/wizard/smoke - path = /spell/aoe_turf/smoke - desc = "This contract smells as dank as they come." - -/obj/item/contract/boon/wizard/forcewall - path = /spell/aoe_turf/conjure/forcewall - contract_master = "\improper Mime Federation" - desc = "This contract has a dedication to mimes everywhere at the top." - -/obj/item/contract/boon/wizard/knock - path = /spell/aoe_turf/knock - desc = "This contract is hard to hold still." - -/obj/item/contract/boon/wizard/horsemask - path = /spell/targeted/equip_item/horsemask - desc = "This contract is more horse than your mind has room for." - -/obj/item/contract/boon/wizard/charge - path = /spell/aoe_turf/charge - desc = "This contract is made of 100% post-consumer wizard." - diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm deleted file mode 100644 index 752a17eecb72..000000000000 --- a/code/modules/spells/general/acid_spray.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/acid_spray - name = "Acid Spray" - desc = "A common spell used to destroy basically anything in front of the wizard." - school = "conjuration" - feedback = "as" - spell_flags = 0 - charge_max = 600 - - invocation = "Tagopar lethodar!" - invocation_type = SpI_SHOUT - var/reagent_type = /decl/material/liquid/acid/hydrochloric - hud_state = "wiz_acid" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/acid_spray/choose_targets() - return list(holder) - -/spell/acid_spray/cast(var/list/targets, var/mob/user) - var/atom/target = targets[1] - var/angle = dir2angle(target.dir) - for(var/mod in list(315, 0, 45)) - var/obj/effect/effect/water/chempuff/chem = new(get_turf(target)) - chem.create_reagents(10) - chem.add_to_reagents(reagent_type,10) - spawn(0) - chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm deleted file mode 100644 index 68e20f3d6f9a..000000000000 --- a/code/modules/spells/general/area_teleport.dm +++ /dev/null @@ -1,60 +0,0 @@ -/spell/area_teleport - name = "Teleport" - desc = "This spell teleports you to a type of area of your selection." - feedback = "TP" - school = "conjuration" - charge_max = 60 SECONDS - spell_flags = NEEDSCLOTHES - invocation = "Scyar Nila!" - invocation_type = SpI_SHOUT - cooldown_min = 200 //100 deciseconds reduction per rank - - smoke_spread = 1 - smoke_amt = 5 - - var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list - var/invocation_area = 1 //if the invocation appends the selected area - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/area_teleport/before_cast() - return - -/spell/area_teleport/choose_targets() - var/area/thearea - if(!randomise_selection) - thearea = input("Area to teleport to", "Teleport") as null|anything in wizteleportlocs - if(!thearea) - return - else - thearea = pick(wizteleportlocs) - return list(wizteleportlocs[thearea]) - -/spell/area_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - return - -/spell/area_teleport/check_valid_targets(list/targets) - // Teleport should function across z's, so we make sure that happens - // without this check, it only works for teleporting to areas you can see - return islist(targets) && length(targets) - -/spell/area_teleport/after_cast() - return - -/spell/area_teleport/invocation(mob/user, area/chosenarea) - if(!istype(chosenarea)) - return //can't have that, can we - if(!invocation_area || !chosenarea) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return diff --git a/code/modules/spells/general/camera_vision.dm b/code/modules/spells/general/camera_vision.dm deleted file mode 100644 index cfd0cfb030e2..000000000000 --- a/code/modules/spells/general/camera_vision.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/camera_connection - name = "Camera Connection" - desc = "This spell allows the wizard to connect to the local camera network and see what it sees." - - school = "racial" - - invocation_type = SpI_EMOTE - invocation = "emits a beeping sound before standing very, very still." - - charge_max = 600 //1 minute - charge_type = Sp_RECHARGE - - - spell_flags = Z2NOCAST - hud_state = "wiz_IPC" - - var/extension_type = /datum/extension/eye/cameranet - -/spell/camera_connection/New() - ..() - set_extension(src, extension_type) - -/spell/camera_connection/choose_targets() - var/mob/living/L = holder - if(!istype(L) || L.eyeobj) //no using if we already have an eye on. - return null - return list(holder) - -/spell/camera_connection/cast(var/list/targets, mob/user) - var/mob/living/L = targets[1] - - var/datum/extension/eye/cameranet/cn = get_extension(src, /datum/extension/eye/) - if(!cn) - to_chat(user, SPAN_WARNING("There's a flash of sparks as the spell fizzles out!")) - return - cn.look(L) \ No newline at end of file diff --git a/code/modules/spells/general/contract_spells.dm b/code/modules/spells/general/contract_spells.dm deleted file mode 100644 index fa95cd16e23c..000000000000 --- a/code/modules/spells/general/contract_spells.dm +++ /dev/null @@ -1,68 +0,0 @@ -//These spells are given to the owner of a contract when a victim signs it. -//As such they are REALLY REALLY powerful (because the victim is rewarded for signing it, and signing contracts is completely voluntary) - -/spell/contract - name = "Contract Spell" - desc = "A spell perfecting the techniques of keeping a servant happy and obedient." - - school = "transmutation" - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - - - var/mob/subject - -/spell/contract/New(var/mob/M) - ..() - subject = M - name += " ([M.real_name])" - -/spell/contract/choose_targets() - return list(subject) - -/spell/contract/cast(mob/target,mob/user) - if(!subject) - to_chat(usr, "This spell was not properly given a target. Contact a coder.") - return null - - if(istype(target,/list)) - var/list/target_list = target - target = target_list[1] - return target - - -/spell/contract/reward - name = "Reward Contractee" - desc = "A spell that makes your contracted victim feel better." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "wiz_jaunt_old" - -/spell/contract/reward/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, SPAN_BLUE("You feel great!")) - target.ExtinguishMob() - -/spell/contract/punish - name = "Punish Contractee" - desc = "A spell that sets your contracted victim ablaze." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "gen_immolate" - -/spell/contract/punish/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, "You feel punished!") - target.fire_stacks += 15 - target.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm deleted file mode 100644 index 405e161a54a9..000000000000 --- a/code/modules/spells/general/create_air.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/create_air - name = "Create Air" - desc = "A much used spell used in the vasteness of space to make it not so killey." - - charge_max = 200 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "wiz_air" - var/list/air_change = list(/decl/material/gas/oxygen = ONE_ATMOSPHERE) - -/spell/create_air/choose_targets() - var/air = holder.return_air() - if(air) - return list(air) - return null - -/spell/create_air/cast(var/list/targets, var/mob/holder, var/channel_count) - var/datum/gas_mixture/environment = targets[1] - for(var/gas in air_change) - environment.adjust_gas(gas, air_change[gas]) diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm deleted file mode 100644 index 3fbab715efd1..000000000000 --- a/code/modules/spells/general/invisibility.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/invisibility - name = "invisibility" - desc = "A simple spell of invisibility, for when you really just can't afford a paper bag." - feedback = "IV" - spell_flags = 0 - charge_max = 100 - invocation = "Ror Rim Or!" - invocation_type = SpI_SHOUT - var/on = 0 - hud_state = "invisibility" - -/spell/invisibility/choose_targets() - if(ishuman(holder)) - return holder - -/spell/invisibility/cast(var/mob/living/human/H, var/mob/user) - on = !on - if(on) - if(H.add_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) - H.add_genetic_condition(GENE_COND_CLUMSY) - else if(H.remove_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) - H.remove_genetic_condition(GENE_COND_CLUMSY) \ No newline at end of file diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm deleted file mode 100644 index 11131e72ece2..000000000000 --- a/code/modules/spells/general/mark_recall.dm +++ /dev/null @@ -1,88 +0,0 @@ -/spell/mark_recall - name = "Mark and Recall" - desc = "This spell was created so wizards could get home from the bar without driving. Does not require wizard garb." - feedback = "MK" - school = "conjuration" - charge_max = 600 //1 minutes for how OP this shit is (apparently not as op as I thought) - spell_flags = Z2NOCAST - invocation = "Re-Alki R'natha." - invocation_type = SpI_WHISPER - cooldown_min = 300 - - smoke_amt = 1 - smoke_spread = 5 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - - cast_sound = 'sound/effects/teleport.ogg' - hud_state = "wiz_mark" - var/mark = null - -/spell/mark_recall/choose_targets() - if(!mark) - return list("magical fairy dust") //because why not - else - return list(mark) - -/spell/mark_recall/cast(var/list/targets,mob/user) - if(!targets.len) - return 0 - var/target = targets[1] - if(istext(target)) - mark = new /obj/effect/cleanable/wizard_mark(get_turf(user),src) - return 1 - if(!istype(target,/obj)) //something went wrong - return 0 - var/turf/T = get_turf(target) - if(!T) - return 0 - user.forceMove(T) - ..() - -/spell/mark_recall/empower_spell() - if(!..()) - return 0 - - spell_flags = NO_SOMATIC - - return "You will always be able to cast this spell, even while unconscious or handcuffed." - -/obj/effect/cleanable/wizard_mark - name = "\improper Mark of the Wizard" - desc = "A strange rune said to be made by wizards. Or its just some shmuck playing with crayons again." - icon = 'icons/obj/rune.dmi' - icon_state = "wizard_mark" - anchored = TRUE - layer = TURF_LAYER - is_spawnable_type = FALSE // invalid without spell passed - var/spell/mark_recall/spell - -/obj/effect/cleanable/wizard_mark/Initialize(mapload,var/mrspell) - . = ..() - spell = mrspell - -/obj/effect/cleanable/wizard_mark/Destroy() - spell.mark = null //dereference pls. - spell = null - return ..() - -/obj/effect/cleanable/wizard_mark/attack_hand(var/mob/user) - if(user != spell.holder) - return ..() - user.visible_message("\The [user] mutters an incantation and \the [src] disappears!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/nullrod_act(mob/user, obj/item/nullrod/rod) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [user] dispels \the [src] and it fades away!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/book/spell)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [src] fades away!") - qdel(src) - return TRUE - return ..() \ No newline at end of file diff --git a/code/modules/spells/general/portal_teleport.dm b/code/modules/spells/general/portal_teleport.dm deleted file mode 100644 index 1f1ed0ad603b..000000000000 --- a/code/modules/spells/general/portal_teleport.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/portal_teleport - name = "Create Portal" - desc = "This spell creates a long lasting portal to an area of your selection." - feedback = "TP" - school = "conjuration" - spell_flags = NEEDSCLOTHES - invocation = "Scyar Peranda!" - invocation_type = SpI_SHOUT - charge_max = 30 MINUTES - cooldown_min = 25 MINUTES - - smoke_spread = 1 - smoke_amt = 5 - - var/list/select_areas = list() - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/portal_teleport/before_cast() - return - -/spell/portal_teleport/choose_targets() - var/area/thearea - var/message = alert("Would you like to show station areas?\nNote: it can take up to 5 minutes for the away sites to load in and show up.",, "Yes", "No") - switch(message) - if("Yes") - select_areas = stationlocs - if("No") - select_areas = (stationlocs) ^ (wizportallocs) - - thearea = input("Area to teleport to", "Teleport") as null|anything in select_areas - if(!thearea) return - - return list(select_areas[thearea]) - -/spell/portal_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/start = get_turf(user) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - - new /obj/effect/portal/wizard(start, end, 35 MINUTES) - new /obj/effect/portal/wizard(end, start, 35 MINUTES) - - return - -/spell/portal_teleport/after_cast() - return - -/spell/portal_teleport/invocation(mob/user, area/chosenarea) - if(!chosenarea || !istype(chosenarea)) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return - -/obj/effect/portal/wizard - name = "dark anomaly" - desc = "It pulls on the edges of reality as if trying to draw them in." - icon = 'icons/obj/objects.dmi' - icon_state = "bhole3" diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm deleted file mode 100644 index 27e85404027e..000000000000 --- a/code/modules/spells/general/radiant_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/radiant_aura - name = "Radiant aura" - desc = "Form a protective layer of light around you, making you immune to laser fire." - feedback = "ra" - invocation_type = SpI_EMOTE - invocation = "conjures a sphere of fire around themselves." - school = "conjuration" - spell_flags = NEEDSCLOTHES - charge_max = 300 - cooldown_min = 100 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 0) - cast_sound = 'sound/effects/snap.ogg' - duration = 40 - hud_state = "gen_immolate" - -/spell/radiant_aura/choose_targets() - return list(holder) - -/spell/radiant_aura/cast(var/list/targets, var/mob/user) - var/obj/aura/radiant_aura/A = new(user) - QDEL_IN(A,duration) diff --git a/code/modules/spells/general/return_master.dm b/code/modules/spells/general/return_master.dm deleted file mode 100644 index 119cc93804de..000000000000 --- a/code/modules/spells/general/return_master.dm +++ /dev/null @@ -1,23 +0,0 @@ -/spell/contract/return_master - name = "Return to Master" - desc = "Teleport back to your master" - - school = "conjuration" - charge_max = 600 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - cooldown_min = 200 - - smoke_spread = 1 - smoke_amt = 5 - - hud_state = "wiz_tele" - - -/spell/contract/return_master/cast(mob/target,mob/user) - target = ..(target,user) - if(!target) - return - - user.forceMove(get_turf(target)) \ No newline at end of file diff --git a/code/modules/spells/general/toggle_armor.dm b/code/modules/spells/general/toggle_armor.dm deleted file mode 100644 index 5da3bf537f83..000000000000 --- a/code/modules/spells/general/toggle_armor.dm +++ /dev/null @@ -1,121 +0,0 @@ -/spell/toggle_armor - name = "Toggle Armor" - spell_flags = 0 - charge_max = 10 - school = "Conjuration" - var/list/armor_pieces - var/equip = 0 - hud_state = "const_shell" - -/spell/toggle_armor/New() - if(armor_pieces) - var/list/nlist = list() - for(var/type in armor_pieces) - var/obj/item/I = new type(null) - nlist[I] = armor_pieces[type] - armor_pieces = nlist - return ..() - -/spell/toggle_armor/proc/drop_piece(var/obj/I) - if(ismob(I.loc)) - var/mob/M = I.loc - M.drop_from_inventory(I) - -/spell/toggle_armor/choose_targets() - return list(holder) - -/spell/toggle_armor/cast(var/list/targets, var/mob/user) - equip = !equip - name = "[initial(name)] ([equip ? "off" : "on"])" - if(equip) - for(var/piece in armor_pieces) - var/slot = armor_pieces[piece] - drop_piece(piece) - user.drop_from_inventory(user.get_equipped_item(slot)) - user.equip_to_slot_if_possible(piece,slot,0,1,1,1) - else - for(var/piece in armor_pieces) - var/obj/item/I = piece - drop_piece(piece) - I.forceMove(null) - -/spell/toggle_armor/greytide_worldwide - name = "Greytide Worldwide" - invocation_type = SpI_EMOTE - invocation = "screams incoherently!" - armor_pieces = list(/obj/item/clothing/jumpsuit/grey = slot_w_uniform_str, - /obj/item/clothing/gloves/insulated/cheap = slot_gloves_str, - /obj/item/clothing/mask/gas = slot_wear_mask_str, - /obj/item/clothing/shoes/color/black = slot_shoes_str, - /obj/item/toolbox/mechanical = BP_R_HAND, - /obj/item/chems/spray/extinguisher = BP_L_HAND) - -/spell/toggle_armor/caretaker - name = "Toggle Armor (Caretaker)" - invocation_type = SpI_EMOTE - invocation = "radiates a holy light" - armor_pieces = list(/obj/item/clothing/head/caretakerhood = slot_head_str, - /obj/item/clothing/suit/caretakercloak = slot_wear_suit_str - ) - hud_state = "caretaker" - -/spell/toggle_armor/champion - name = "Toggle Armor (Champion)" - invocation_type = SpI_EMOTE - invocation = "is covered in golden embers for a moment, before they fade" - armor_pieces = list(/obj/item/clothing/head/champhelm = slot_head_str, - /obj/item/clothing/suit/champarmor = slot_wear_suit_str - ) - hud_state = "champion" - -/spell/toggle_armor/excalibur - name = "Toggle Sword" - invocation_type = SpI_EMOTE - invocation = "thrusts /his hand forward, and it is enveloped in golden embers!" - armor_pieces = list(/obj/item/sword/excalibur = BP_R_HAND) - hud_state = "excalibur" - -/spell/toggle_armor/fiend - name = "Toggle Armor (Fiend)" - invocation_type = SpI_EMOTE - invocation = "snaps /his fingers, and /his clothes begin to shift and change" - armor_pieces = list(/obj/item/clothing/head/fiendhood = slot_head_str, - /obj/item/clothing/suit/fiendcowl = slot_wear_suit_str - ) - hud_state = "fiend" - -/spell/toggle_armor/fiend/fem - armor_pieces = list(/obj/item/clothing/head/fiendhood/fem = slot_head_str, - /obj/item/clothing/suit/fiendcowl/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infiltrator - name = "Toggle Armor (Infiltrator)" - invocation_type = SpI_EMOTE - invocation = "winks. In an instant, /his clothes change dramatically" - armor_pieces = list(/obj/item/clothing/head/infilhat = slot_head_str, - /obj/item/clothing/suit/infilsuit = slot_wear_suit_str - ) - hud_state = "infiltrator" - -/spell/toggle_armor/infiltrator/fem - armor_pieces = list(/obj/item/clothing/head/infilhat/fem = slot_head_str, - /obj/item/clothing/suit/infilsuit/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infil_items - name = "Toggle Counterfeit Kit" - invocation_type = SpI_EMOTE - invocation = "flicks /his wrists, one at a time" - armor_pieces = list(/obj/item/stamp/chameleon = BP_L_HAND, - /obj/item/pen/chameleon = BP_R_HAND) - hud_state = "forgery" - -/spell/toggle_armor/overseer - name = "Toggle Armor (Overseer)" - invocation_type = SpI_EMOTE - invocation = " is enveloped in shadows, before /his form begins to shift rapidly" - armor_pieces = list(/obj/item/clothing/head/overseerhood = slot_head_str, - /obj/item/clothing/suit/straight_jacket/overseercloak = slot_wear_suit_str - ) - hud_state = "overseer" \ No newline at end of file diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm deleted file mode 100644 index 0908ee285201..000000000000 --- a/code/modules/spells/hand/blood_shards.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/charges/blood_shard - name = "Blood Shards" - desc = "Invoke a corrupted projectile forward that causes an enemy's blood to fly out in painful shards. Anyone hit by this will have their blood explode out of them in a spray of smaller shards. Stores two charges." - spell_flags = 0 - charge_max = 600 - invocation = "opens their hand, which bursts into vicious red light." - invocation_type = SpI_EMOTE - - range = 7 - max_casts = 2 - compatible_targets = list(/atom) - hud_state = "wiz_bshard" - cast_sound = 'sound/magic/demon_attack1.ogg' - -/spell/hand/charges/blood_shard/cast_hand(var/atom/A,var/mob/user) - var/obj/item/projectile/blood_shard/B = new(get_turf(user)) - B.firer = user - B.launch(A, BP_CHEST) - user.visible_message("\The [user] shoots out a deep red shard from their hand!") - return ..() - -/obj/item/projectile/blood_shard - name = "bloodshard" - damage = 25 - icon_state = "blood" - atom_damage_type = BRUTE - damage_flags = 0 - -/obj/item/projectile/blood_shard/on_hit(var/atom/movable/target, var/blocked = 0) - if(..()) - if(ishuman(target)) - var/mob/living/human/H = target - H.vessel.remove_any(30) - H.visible_message("Tiny red shards burst from \the [H]'s skin!") - fragmentate(get_turf(src), 30, 5, list(/obj/item/projectile/bullet/pellet/blood)) - -/obj/item/projectile/bullet/pellet/blood - name = "blood fragment" - damage = 10 \ No newline at end of file diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm deleted file mode 100644 index 772b4e6aa9c4..000000000000 --- a/code/modules/spells/hand/burning_grip.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/burning_grip - name = "Burning Grip" - desc = "Cause someone to drop a held object by causing it to heat up intensly." - school = "transmutation" - feedback = "bg" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " throws sparks from their hands" - spell_delay = 120 - hud_state = "wiz_burn" - cast_sound = 'sound/magic/fireball.ogg' - compatible_targets = list(/mob/living/human) - -/spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) - if(!..()) - return 0 - if(length(L.get_held_items())) - return 0 - return 1 - -/spell/hand/burning_grip/cast_hand(var/mob/living/human/H, var/mob/user) - var/list/targets = list() - for(var/hand_slot in H.get_held_item_slots()) - targets |= hand_slot - - var/obj/O = new /obj/effect/temporary(get_turf(H),3, 'icons/effects/effects.dmi', "fire_goon") - O.alpha = 150 - - for(var/organ in targets) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, organ) - if(!E) - continue - E.take_external_damage(burn=10, used_weapon = "hot iron") - if(E.can_feel_pain()) - E.check_pain_disarm() - else - E.take_external_damage(burn=6, used_weapon = "hot iron") - to_chat(H, SPAN_WARNING("You notice that your [E] is burned.")) diff --git a/code/modules/spells/hand/entangle.dm b/code/modules/spells/hand/entangle.dm deleted file mode 100644 index 37a4776fe28e..000000000000 --- a/code/modules/spells/hand/entangle.dm +++ /dev/null @@ -1,51 +0,0 @@ -/spell/hand/charges/entangle - name = "Entangle" - desc = "This spell creates vines that immediately entangle a nearby victim." - feedback = "ET" - school = "transmutation" - charge_max = 600 - spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV - invocation = "Bu-Ekel'Inas!" - invocation_type = SpI_SHOUT - range = 3 - max_casts = 1 - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 300 - duration = 30 - compatible_targets = list(/mob) - - hud_state = "wiz_entangle" - cast_sound = 'sound/magic/staff_door.ogg' - show_message = " points towards the ground, causing plants to erupt" - var/datum/seed/seed - -/spell/hand/charges/entangle/New() - ..() - seed = new() - seed.set_trait(TRAIT_PLANT_ICON,"flower") - seed.set_trait(TRAIT_PRODUCT_ICON,"flower2") - seed.set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - seed.set_trait(TRAIT_SPREAD,2) - seed.name = "heirlooms" - seed.product_name = "heirloom" - seed.display_name = "vines" - seed.chems = list(/decl/material/liquid/nutriment = list(1,20)) - -/spell/hand/charges/entangle/cast_hand(var/mob/M,var/mob/user) - var/turf/T = get_turf(M) - var/obj/effect/vine/single/P = new(T, seed, null, TRUE) - P.can_buckle = 1 - - P.buckle_mob(M) - M.set_dir(pick(global.cardinal)) - M.visible_message("[P] appear from the floor, spinning around \the [M] tightly!") - return ..() - -/spell/hand/charges/entangle/empower_spell() - if(!..()) - return 0 - - max_casts++ - - return "This spell will now entangle [max_casts] times before running out." \ No newline at end of file diff --git a/code/modules/spells/hand/hand.dm b/code/modules/spells/hand/hand.dm deleted file mode 100644 index 9652cf1cce18..000000000000 --- a/code/modules/spells/hand/hand.dm +++ /dev/null @@ -1,83 +0,0 @@ -/spell/hand - var/min_range = 0 - var/list/compatible_targets = list(/atom) - var/spell_delay = 5 - var/move_delay - var/click_delay - var/hand_state = "spell" - var/obj/item/magic_hand/current_hand - var/show_message - -/spell/hand/choose_targets(mob/user = usr) - return list(user) - -/spell/hand/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) - if(!..()) - return FALSE - if(user.get_active_held_item()) - to_chat(holder, "You need an empty hand to cast this spell.") - return FALSE - return TRUE - -/spell/hand/cast(list/targets, mob/user) - if(current_hand) - cancel_hand() - if(user.get_active_held_item()) - to_chat(user, "You need an empty hand to cast this spell.") - return FALSE - current_hand = new(null, src) - if(!user.put_in_active_hand(current_hand)) - QDEL_NULL(current_hand) - return FALSE - return TRUE - -/spell/hand/proc/cancel_hand() - if(!QDELETED(current_hand)) - QDEL_NULL(current_hand) - -/spell/hand/Destroy() - QDEL_NULL(current_hand) - . = ..() - -/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use seperate procs for our target checking for the hand spells. - var/distance = get_dist(a,user) - if((min_range && distance < min_range) || (range && distance > range)) - return FALSE - if(!is_type_in_list(a,compatible_targets)) - return FALSE - return TRUE - -/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting. - return TRUE - -/spell/hand/charges - var/casts = 1 - var/max_casts = 1 - -/spell/hand/charges/cast(list/targets, mob/user) - . = ..() - if(.) - casts = max_casts - to_chat(user, "You ready the [name] spell ([casts]/[casts] charges).") - -/spell/hand/charges/cast_hand() - if(..()) - casts-- - to_chat(holder, SPAN_NOTICE("The [name] spell has [casts] out of [max_casts] charges left.")) - cancel_hand() - return TRUE - return FALSE - -/spell/hand/duration - var/hand_timer = null - var/hand_duration = 0 - -/spell/hand/duration/cast(var/list/targets, var/mob/user) - . = ..() - if(.) - hand_timer = addtimer(CALLBACK(src, PROC_REF(cancel_hand)), hand_duration, TIMER_STOPPABLE|TIMER_UNIQUE|TIMER_NO_HASH_WAIT|TIMER_OVERRIDE) - -/spell/hand/duration/cancel_hand() - deltimer(hand_timer) - hand_timer = null - ..() \ No newline at end of file diff --git a/code/modules/spells/hand/hand_item.dm b/code/modules/spells/hand/hand_item.dm deleted file mode 100644 index 6141577f2471..000000000000 --- a/code/modules/spells/hand/hand_item.dm +++ /dev/null @@ -1,68 +0,0 @@ -/*much like grab this item is used primarily for the utility it provides. -Basically: I can use it to target things where I click. I can then pass these targets to a spell and target things not using a list. -*/ - -/obj/item/magic_hand - name = "Magic Hand" - icon = 'icons/mob/screen/spells.dmi' - atom_flags = 0 - item_flags = 0 - obj_flags = 0 - simulated = 0 - icon_state = "spell" - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE - obj_flags = OBJ_FLAG_NO_STORAGE - var/next_spell_time = 0 - var/spell/hand/hand_spell - -/obj/item/magic_hand/Initialize(ml, _hand_spell) - . = ..() - hand_spell = _hand_spell - name = "[name] ([hand_spell.name])" - icon_state = hand_spell.hand_state - -// These return values do not look correct... -/obj/item/magic_hand/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(hand_spell && hand_spell.valid_target(target, user)) - fire_spell(target, user) - return FALSE - return TRUE - -/obj/item/magic_hand/proc/fire_spell(var/atom/A, mob/living/user) - if(!hand_spell) //no spell? Die. - user.drop_from_inventory(src) - - if(!hand_spell.valid_target(A,user)) - return - if(world.time < next_spell_time) - to_chat(user, "The spell isn't ready yet!") - return - if(user.check_intent(I_FLAG_HELP)) - to_chat(user, "You decide against casting this spell as your intent is set to help.") - return - - if(hand_spell.show_message) - user.visible_message("\The [user][hand_spell.show_message]") - if(hand_spell.cast_hand(A,user)) - next_spell_time = world.time + hand_spell.spell_delay - if(hand_spell.move_delay) - user.ExtraMoveCooldown(hand_spell.move_delay) - if(hand_spell.click_delay) - user.setClickCooldown(hand_spell.move_delay) - -/obj/item/magic_hand/afterattack(var/atom/A, var/mob/user, var/proximity) - if(hand_spell) - fire_spell(A,user) - -/obj/item/magic_hand/throw_at() //no throwing pls - usr.drop_from_inventory(src) - -/obj/item/magic_hand/dropped() //gets deleted on drop - ..() - qdel(src) - -/obj/item/magic_hand/Destroy() //better save than sorry. - hand_spell.current_hand = null - hand_spell = null - . = ..() \ No newline at end of file diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm deleted file mode 100644 index 3b5fc448d034..000000000000 --- a/code/modules/spells/hand/slippery_surface.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/hand/slippery_surface - name = "Slippery Surface" - desc = "More of a practical joke than an actual spell." - school = "transmutation" - feedback = "su" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " snaps their fingers." - spell_delay = 50 - hud_state = "gen_ice" - cast_sound = 'sound/magic/summonitems_generic.ogg' - -/spell/hand/slippery_surface/cast_hand(var/atom/a, var/mob/user) - for(var/turf/T in view(1,a)) - if(T.simulated) - T.wet_floor(50) - new /obj/effect/temporary(T, 3, 'icons/effects/effects.dmi', "sonar_ping") - return ..() diff --git a/code/modules/spells/hand/sunwrath.dm b/code/modules/spells/hand/sunwrath.dm deleted file mode 100644 index 63da9a54c611..000000000000 --- a/code/modules/spells/hand/sunwrath.dm +++ /dev/null @@ -1,32 +0,0 @@ -/spell/hand/duration/sunwrath - name = "Sun God's Wrath" - desc = "Your hands become a gateway of fire, shooting hot plasma from your fingertips." - spell_flags = 0 - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Herald! Bless me with your anger!" - show_message = " erupts fire from their hands" - school = "Divine" - hand_duration = 100 - spell_delay = 30 - range = 4 - hud_state = "wiz_immolate" - -/spell/hand/duration/sunwrath/cast_hand(var/atom/A, var/mob/user) - var/turf/T = get_turf(user) - var/list/turfs = getline(T,A) - T - for(var/t in turfs) - var/turf/turf = t - if(turf.density || isspaceturf(turf)) - break - new /obj/effect/fake_fire/sunwrath(t) - return 1 - -/obj/effect/fake_fire/sunwrath - firelevel = 2 - last_temperature = 0 - pressure = 3000 - -/obj/effect/fake_fire/sunwrath/Process() //Override, so we burn mobs only - for(var/mob/living/L in loc) - L.FireBurn(firelevel,last_temperature,pressure) \ No newline at end of file diff --git a/code/modules/spells/no_clothes.dm b/code/modules/spells/no_clothes.dm deleted file mode 100644 index 3b8502923519..000000000000 --- a/code/modules/spells/no_clothes.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/noclothes - name = "No Clothes" - desc = "Learn the ancient art of not wearing fancy robes while casting spells." - feedback = "NC" - spell_flags = NO_BUTTON \ No newline at end of file diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm deleted file mode 100644 index ce5c4e651162..000000000000 --- a/code/modules/spells/racial_wizard.dm +++ /dev/null @@ -1,81 +0,0 @@ -//this file is full of all the racial spells/artifacts/etc that each species has. - -/obj/item/magic_rock - name = "magical rock" - desc = "Legends say that this rock will unlock the true potential of anyone who touches it." - icon = 'icons/obj/wizard.dmi' - icon_state = "magic rock" - w_class = ITEM_SIZE_SMALL - throw_speed = 1 - throw_range = 3 - material = /decl/material/solid/stone/basalt - var/list/potentials = list( - SPECIES_HUMAN = /obj/item/bag/cash/infinite - ) - -/obj/item/magic_rock/attack_self(mob/user) - if(!ishuman(user)) - to_chat(user, "\The [src] can do nothing for such a simple being.") - return - var/mob/living/human/H = user - var/reward = potentials[H.species.get_root_species_name(H)] //we get body type because that lets us ignore subspecies. - if(!reward) - to_chat(user, "\The [src] does not know what to make of you.") - return - for(var/spell/S in user.mind.learned_spells) - if(istype(S,reward)) - to_chat(user, "\The [src] can do no more for you.") - return - var/a = new reward() - if(ispath(reward,/spell)) - H.add_spell(a) - else if(ispath(reward,/obj)) - H.put_in_hands(a) - to_chat(user, "\The [src] crumbles in your hands.") - qdel(src) - -/obj/item/bag/cash/infinite - storage = /datum/storage/bag/cash/infinite - -/obj/item/bag/cash/infinite/WillContain() - return list(/obj/item/cash/c1000) - -/spell/messa_shroud/choose_targets() - return list(get_turf(holder)) - -/spell/messa_shroud/cast(var/list/targets, mob/user) - var/turf/T = targets[1] - - if(!istype(T)) - return - - var/obj/O = new /obj(T) - O.set_light(range, -10, "#ffffff") - - spawn(duration) - qdel(O) - -/mob/observer/eye/freelook/wizard_eye - name_sufix = "Wizard Eye" - -/mob/observer/eye/freelook/wizard_eye/Initialize() - . = ..() //we dont use the Ai one because it has AI specific procs imbedded in it. - visualnet = cameranet - -/mob/living/proc/release_eye() - set name = "Release Vision" - set desc = "Return your sight to your body." - set category = "Abilities" - - verbs -= /mob/living/proc/release_eye //regardless of if we have an eye or not we want to get rid of this verb. - - if(!eyeobj) - return - eyeobj.release(src) - -/mob/observer/eye/freelook/wizard_eye/Destroy() - if(isliving(eyeobj.owner)) - var/mob/living/L = eyeobj.owner - L.release_eye() - qdel(eyeobj) - return ..() \ No newline at end of file diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 653d2b8cae2f..bfcf1f4d8f6c 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -26,7 +26,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - var/spell_flags = NEEDSCLOTHES + var/spell_flags = 0 var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote var/range = 7 //the range of the spell; outer radius for aoe spells @@ -241,21 +241,14 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now to_chat(SA, "The null sceptre's power interferes with your own!") return 0 - if(!(spell_flags & GHOSTCAST)) - if(!(spell_flags & NO_SOMATIC)) - var/mob/living/L = user - if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) - to_chat(user, "You can't cast spells while incapacitated!") - return 0 - - if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) - to_chat(user, "Mmmf mrrfff!") - return 0 + var/mob/living/L = user + if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) + to_chat(user, "You can't cast spells while incapacitated!") + return 0 - var/spell/noclothes/spell = locate() in user.mind.learned_spells - if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)))//clothes check - if(!user.wearing_wiz_garb()) - return 0 + if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) + to_chat(user, "Mmmf mrrfff!") + return 0 return 1 @@ -381,10 +374,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now if(!user || isnull(user)) return 0 - var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING - if(!(spell_flags & (GHOSTCAST))) - incap_flags |= INCAPACITATION_KNOCKOUT - + var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT return do_after(user,delay, incapacitation_flags = incap_flags) /proc/view_or_range(distance = world.view , center = usr , type) diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm deleted file mode 100644 index 1599a59d3a78..000000000000 --- a/code/modules/spells/spell_projectile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/item/projectile/spell_projectile - name = "spell" - icon = 'icons/obj/projectiles.dmi' - - nodamage = 1 //Most of the time, anyways - - var/spell/targeted/projectile/carried - - penetrating = 0 - life_span = 10 //set by the duration of the spell - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - var/list/trails = new() - -/obj/item/projectile/spell_projectile/Destroy() - for(var/trail in trails) - qdel(trail) - carried = null - return ..() - -/obj/item/projectile/spell_projectile/explosion_act() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/item/projectile/spell_projectile/before_move() - if(proj_trail && src && src.loc) //pretty trails - var/obj/effect/overlay/trail = new /obj/effect/overlay(loc) - trails += trail - trail.icon = proj_trail_icon - trail.icon_state = proj_trail_icon_state - trail.set_density(0) - spawn(proj_trail_lifespan) - trails -= trail - qdel(trail) - -/obj/item/projectile/spell_projectile/proc/prox_cast(var/list/targets) - if(loc) - carried.prox_cast(targets, src) - qdel(src) - return - -/obj/item/projectile/spell_projectile/Bump(var/atom/A, forced=0) - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/on_impact() - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/seeking - name = "seeking spell" diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm deleted file mode 100644 index fa43c3e8d63f..000000000000 --- a/code/modules/spells/spellbook.dm +++ /dev/null @@ -1,322 +0,0 @@ -#define NOREVERT 1 -#define LOCKED 2 -#define CAN_MAKE_CONTRACTS 4 -#define INVESTABLE 8 -#define NO_LOCKING 16 - -//spells/spellbooks have a variable for this but as artefacts are literal items they do not. -//so we do this instead. -var/global/list/artefact_feedback = list( - /obj/structure/closet/wizard/armor = "HS", - /obj/item/gun/energy/staff/focus = "MF", - /obj/item/gun/energy/staff/fire = "FS", - /obj/item/summoning_stone = "ST", - /obj/item/magic_rock = "RA", - /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/scrying = "SO", - /obj/item/paper/scroll/teleportation = "TS", - /obj/item/gun/energy/staff = "ST", - /obj/item/gun/energy/staff/animate = "SA", - /obj/item/dice/d20/cursed = "DW" -) - -/obj/item/book/spell - name = "master spell book" - desc = "The legendary book of spells of the wizard." - throw_speed = 1 - throw_range = 5 - w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/organic/paper - matter = list(/decl/material/solid/organic/leather = MATTER_AMOUNT_REINFORCEMENT) - unique = TRUE - var/uses = 1 - var/temp = null - var/datum/spellbook/spellbook - var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks. - var/investing_time = 0 //what time we target forr a return on our spell investment. - var/has_sacrificed = 0 //whether we have already got our sacrifice bonus for the current investment. - -/obj/item/book/spell/Initialize() - . = ..() - set_spellbook(spellbook_type) - -/obj/item/book/spell/try_carve() - return FALSE - -/obj/item/book/spell/proc/set_spellbook(var/type) - if(spellbook) - qdel(spellbook) - spellbook = new type() - uses = spellbook.max_uses - name = spellbook.name - desc = spellbook.desc - -/obj/item/book/spell/attack_self(mob/user) - if(!user.mind) - return - if (user.mind.assigned_special_role != /decl/special_role/wizard) - if (user.mind.assigned_special_role != "Wizard's Apprentice") - to_chat(user, "You can't make heads or tails of this book.") - return - if (spellbook.book_flags & LOCKED) - to_chat(user, "Drat! This spellbook's apprentice-proof lock is on!") - return - else if (spellbook.book_flags & LOCKED) - to_chat(user, "You notice the apprentice-proof lock is on. Luckily you are beyond such things.") - interact(user) - -/obj/item/book/spell/proc/make_sacrifice(obj/item/I, mob/user, var/reagent) - if(has_sacrificed) - to_chat(user, SPAN_WARNING("\The [src] is already sated! Wait for a return on your investment before you sacrifice more to it.")) - return - if(reagent) - if(I.reagents?.has_reagent(reagent, 5)) - I.remove_from_reagents(reagent, 5) - else if(LAZYACCESS(I.matter, reagent) >= (SHEET_MATERIAL_AMOUNT * 5)) - qdel(I) - else - if(istype(I,/obj/item/stack)) - var/obj/item/stack/S = I - if(S.amount < S.max_amount) - to_chat(usr, "You must sacrifice [S.max_amount] stacks of [S]!") - return - qdel(I) - to_chat(user, "Your sacrifice was accepted!") - has_sacrificed = 1 - investing_time = max(investing_time - 6000,1) //subtract 10 minutes. Make sure it doesn't act funky at the beginning of the game. - - -/obj/item/book/spell/attackby(obj/item/I, mob/user) - if(investing_time) - for(var/type in spellbook.sacrifice_objects) - if(istype(I,type)) - make_sacrifice(I, user) - return TRUE - - for(var/mat in spellbook.sacrifice_materials) - if(LAZYACCESS(I.matter, mat) > (SHEET_MATERIAL_AMOUNT * 10)) - make_sacrifice(I, user, mat) - return TRUE - - if(I.reagents) - for(var/id in spellbook.sacrifice_reagents) - if(I.reagents.has_reagent(id, 5)) - make_sacrifice(I, user, id) - return TRUE - return ..() - -/obj/item/book/spell/interact(mob/user) - var/dat = null - if(temp) - dat = "[temp]
Return" - else - dat = "

[spellbook.title]

[spellbook.title_desc]
You have [uses] spell slot\s left.

" - dat += "
Requires Wizard Garb
Selectable Target
Spell Charge Type: Recharge, Sacrifice, Charges

" - dat += "
To use a contract, first bind it to your soul, then give it to someone to sign. This will bind their soul to you.

" - for(var/i in 1 to spellbook.spells.len) - var/name = "" //name of target - var/desc = "" //description of target - var/info = "" //additional information - if(ispath(spellbook.spells[i],/datum/spellbook)) - var/datum/spellbook/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.book_desc) - info = "[initial(S.max_uses)] Spell Slots" - else if(ispath(spellbook.spells[i],/obj)) - var/obj/O = spellbook.spells[i] - name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird. - desc = initial(O.desc) - else if(ispath(spellbook.spells[i],/spell)) - var/spell/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.desc) - var/testing = initial(S.spell_flags) - if(testing & NEEDSCLOTHES) - info = "W" - var/type = "" - switch(initial(S.charge_type)) - if(Sp_RECHARGE) - type = "R" - if(Sp_HOLDVAR) - type = "S" - if(Sp_CHARGES) - type = "C" - info += "[type]" - dat += "[name]" - if(length(info)) - dat += " ([info])" - dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])" - if(spellbook.book_flags & CAN_MAKE_CONTRACTS) - dat += " Make Contract" - dat += "
[desc]

" - dat += "
" - dat += "
Re-memorise your spellbook.
" - if(spellbook.book_flags & INVESTABLE) - if(investing_time) - dat += "
Currently investing in a slot...
" - else - dat += "
Invest a Spell Slot
Investing a spellpoint will return two spellpoints back in 15 minutes.
Some say a sacrifice could even shorten the time...
" - if(!(spellbook.book_flags & NOREVERT)) - dat += "
Choose different spellbook.
" - if(!(spellbook.book_flags & NO_LOCKING)) - dat += "
[spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
" - show_browser(user, dat, "window=spellbook") - -/obj/item/book/spell/CanUseTopic(var/mob/living/human/H) - if(!istype(H)) - return STATUS_CLOSE - - if(H.mind && (spellbook.book_flags & LOCKED) && H.mind.assigned_special_role == "Wizard's Apprentice") //make sure no scrubs get behind the lock - return STATUS_CLOSE - - return ..() - -/obj/item/book/spell/OnTopic(var/mob/living/human/user, href_list) - if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) - if(spellbook.book_flags & LOCKED) - spellbook.book_flags &= ~LOCKED - else - spellbook.book_flags |= LOCKED - . = TOPIC_REFRESH - - else if(href_list["temp"]) - temp = null - . = TOPIC_REFRESH - - else if(href_list["book"]) - if(initial(spellbook.max_uses) != spellbook.max_uses || uses != spellbook.max_uses) - temp = "You've already purchased things using this spellbook!" - else - src.set_spellbook(/datum/spellbook) - temp = "You have reverted back to the Book of Tomes." - . = TOPIC_REFRESH - - else if(href_list["invest"]) - temp = invest() - . = TOPIC_REFRESH - - else if(href_list["path"]) - var/path = locate(href_list["path"]) in spellbook.spells - if(!path) - return TOPIC_HANDLED - if(uses < spellbook.spells[path]) - to_chat(user, "You do not have enough spell slots to purchase this.") - return TOPIC_HANDLED - send_feedback(path) //feedback stuff - if(ispath(path,/datum/spellbook)) - src.set_spellbook(path) - temp = "You have chosen a new spellbook." - else - if(href_list["contract"]) - if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS)) - return //no - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] //no basksies - var/obj/O = new /obj/item/contract/boon(get_turf(user),path) - temp = "You have purchased \the [O]." - else - if(ispath(path,/spell)) - temp = src.add_spell(user,path) - if(temp) - uses -= spellbook.spells[path] - else - var/obj/O = new path(get_turf(user)) - temp = "You have purchased \a [O]." - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] - //finally give it a bit of an oomf - playsound(get_turf(user),'sound/effects/phasein.ogg',50,1) - . = TOPIC_REFRESH - - else if(href_list["reset"] && !(spellbook.book_flags & NOREVERT)) - var/area/map_template/wizard_station/A = get_area(user) - if(istype(A)) - uses = spellbook.max_uses - investing_time = 0 - has_sacrificed = 0 - user.spellremove() - temp = "All spells and investments have been removed. You may now memorise a new set of spells." - SSstatistics.add_field_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - else - to_chat(user, "You must be in the wizard academy to re-memorise your spells.") - . = TOPIC_REFRESH - - src.interact(user) - -/obj/item/book/spell/proc/invest() - if(uses < 1) - return "You don't have enough slots to invest!" - if(investing_time) - return "You can only invest one spell slot at a time." - uses-- - START_PROCESSING(SSobj, src) - investing_time = world.time + (15 MINUTES) - return "You invest a spellslot and will recieve two in return in 15 minutes." - -/obj/item/book/spell/Process() - if(investing_time && investing_time <= world.time) - src.visible_message("\The [src] emits a soft chime.") - uses += 2 - if(uses > spellbook.max_uses) - spellbook.max_uses = uses - investing_time = 0 - has_sacrificed = 0 - STOP_PROCESSING(SSobj, src) - return 1 - -/obj/item/book/spell/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/book/spell/proc/send_feedback(var/path) - if(ispath(path,/datum/spellbook)) - var/datum/spellbook/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/spell)) - var/spell/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/obj)) - SSstatistics.add_field_details("wizard_spell_learned","[artefact_feedback[path]]") - - -/obj/item/book/spell/proc/add_spell(var/mob/user, var/spell_path) - for(var/spell/S in user.mind.learned_spells) - if(istype(S,spell_path)) - if(!S.can_improve()) - return - if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER)) - switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel")) - if("Speed") - return S.quicken_spell() - if("Power") - return S.empower_spell() - else - return - else if(S.can_improve(Sp_POWER)) - return S.empower_spell() - else if(S.can_improve(Sp_SPEED)) - return S.quicken_spell() - - var/spell/S = new spell_path() - user.add_spell(S) - return "You learn the spell [S]" - -/datum/spellbook - var/name = "\improper Book of Tomes" - var/desc = "The legendary book of spells of the wizard." - var/book_desc = "Holds information on the various tomes available to a wizard" - var/feedback = "" //doesn't need one. - var/book_flags = NOREVERT - var/max_uses = 1 - var/title = "Book of Tomes" - var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds." - var/list/spells = list(/datum/spellbook/standard = 1, - /datum/spellbook/cleric = 1, - /datum/spellbook/battlemage = 1, - /datum/spellbook/spatial = 1, - /datum/spellbook/druid = 1 - ) //spell's path = cost of spell - - var/list/sacrifice_reagents - var/list/sacrifice_objects - var/list/sacrifice_materials diff --git a/code/modules/spells/spellbook/battlemage.dm b/code/modules/spells/spellbook/battlemage.dm deleted file mode 100644 index 07cebf63d820..000000000000 --- a/code/modules/spells/spellbook/battlemage.dm +++ /dev/null @@ -1,44 +0,0 @@ -//Battlemage is all about mixing physical with the mystical in head to head combat. -//Things like utility and mobility come second. -/datum/spellbook/battlemage - name = "\improper Battlemage's Bible" - feedback = "BM" - desc = "Smells like blood." - book_desc = "Mix physical with the mystical in head to head combat." - title = "The Art of Magical Combat" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/targeted/equip_item/dyrnwyn = 1, - /spell/targeted/equip_item/shield = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/targeted/torment = 1, - /spell/targeted/heal_target = 2, - /spell/aoe_turf/conjure/mirage = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/radiant_aura = 1, - /spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/dice/d20/cursed = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/xray = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/sword, - /obj/item/bladed/axe/fire, - /obj/item/baton, - /obj/item/knife/ritual, - /obj/item/knife/kitchen/cleaver, - /obj/item/knife/folding/combat/balisong, - /obj/item/knife/folding/tacticool, - /obj/item/star - ) diff --git a/code/modules/spells/spellbook/cleric.dm b/code/modules/spells/spellbook/cleric.dm deleted file mode 100644 index 98c5a48f6d52..000000000000 --- a/code/modules/spells/spellbook/cleric.dm +++ /dev/null @@ -1,50 +0,0 @@ -//Cleric is all about healing. Mobility and offense comes at a higher price but not impossible. -/obj/item/book/spell/cleric - spellbook_type = /datum/spellbook/cleric - -/datum/spellbook/cleric - name = "\improper Cleric's Tome" - feedback = "CR" - desc = "For those who do not harm, or at least feel sorry about it." - book_desc = "All about healing. Mobility and offense comes at a higher price but not impossible." - title = "Cleric's Tome of Healing" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 7 - - spells = list( - /spell/targeted/heal_target/major = 1, - /spell/targeted/heal_target/area = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/shapeshift/baleful_polymorph = 1, - /spell/targeted/projectile/dumbfire/stuncuff = 1, - /spell/targeted/ethereal_jaunt = 2, - /spell/aoe_turf/knock = 1, - /spell/radiant_aura = 1, - /spell/targeted/equip_item/holy_relic = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/targeted/projectile/dumbfire/fireball = 2, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/adminordrazine - ) - sacrifice_objects = list( - /obj/item/stack/nanopaste, - /obj/item/scanner/health, - /obj/item/scanner/breath, - /obj/item/stack/medical/bandage/advanced, - /obj/item/stack/medical/ointment/advanced, - /obj/item/bodybag/rescue, - /obj/item/defibrillator - ) diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm deleted file mode 100644 index 48ee015d3499..000000000000 --- a/code/modules/spells/spellbook/druid.dm +++ /dev/null @@ -1,43 +0,0 @@ -//all about the summons, nature, and a bit o' healin. - -/obj/item/book/spell/druid - spellbook_type = /datum/spellbook/druid - -/datum/spellbook/druid - name = "\improper Druid's Leaflet" - feedback = "DL" - desc = "It smells like an air freshener." - book_desc = "Summons, nature, and a bit o' healin." - title = "Druidic Guide on how to be smug about nature" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/heal_target = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/aoe_turf/conjure/mirage = 1, - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/aoe_turf/conjure/summon/bear = 1, - /spell/targeted/equip_item/party_hardy = 1, - /spell/targeted/equip_item/seed = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/hand/charges/entangle = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/aoe_turf/knock = 1, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - sacrifice_objects = list( - /obj/item/seeds, - /obj/item/wirecutters/clippers, - /obj/item/scanner/plant, - /obj/item/tool/axe/hatchet, - /obj/item/tool/hoe/mini - ) diff --git a/code/modules/spells/spellbook/spatial.dm b/code/modules/spells/spellbook/spatial.dm deleted file mode 100644 index def9a6695d25..000000000000 --- a/code/modules/spells/spellbook/spatial.dm +++ /dev/null @@ -1,48 +0,0 @@ -//all about moving around and mobility and being an annoying shit. - -/obj/item/book/spell/spatial - spellbook_type = /datum/spellbook/spatial - -/datum/spellbook/spatial - name = "\improper Spatial Manual" - feedback = "SP" - desc = "You feel like this might disappear from out of under you." - book_desc = "Movement and teleportation. Run from your problems!" - title = "Manual of Spatial Transportation" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 11 - - spells = list( - /spell/targeted/ethereal_jaunt = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/portal_teleport = 1, - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/mark_recall = 1, - /spell/targeted/swap = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/smoke = 1, - /spell/aoe_turf/conjure/summon/bats = 3, - /spell/noclothes = 1, - /obj/item/dice/d20/cursed = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/paper/scroll/teleportation = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 3, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/amphetamines - ) - sacrifice_objects = list( - /obj/item/stack/telecrystal - ) - sacrifice_materials = list( - /decl/material/solid/gemstone/diamond - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm deleted file mode 100644 index 99e8f27c2740..000000000000 --- a/code/modules/spells/spellbook/standard.dm +++ /dev/null @@ -1,54 +0,0 @@ -//the spellbook we know and love. Well, the one we know, at least. - -/obj/item/book/spell/standard - spellbook_type = /datum/spellbook/standard - -/datum/spellbook/standard - name = "\improper Standard Spellbook" - feedback = "SB" - title = "Book of Spells and Artefacts" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/aoe_turf/smoke = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/subjugation = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/knock = 1, - /spell/noclothes = 2, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/gun/energy/staff/animate = 1, - /obj/structure/closet/wizard/scrying = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/toolbox, - /obj/item/cane/fancy, - /obj/item/flamethrower, - /obj/item/plastique, - /obj/item/dice, - /obj/item/soap, - /obj/item/flame/candle, - /obj/item/flame/candle/scented/incense, - /obj/item/caution, - /obj/item/towel, - /obj/item/tank/jetpack, - /obj/item/plunger, - /obj/item/megaphone, - /obj/item/deck/cards - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/student.dm b/code/modules/spells/spellbook/student.dm deleted file mode 100644 index 1c07a5135b13..000000000000 --- a/code/modules/spells/spellbook/student.dm +++ /dev/null @@ -1,28 +0,0 @@ -//wizard's training wheels. Basically. Same shit as in the general one. - -/obj/item/book/spell/student - spellbook_type = /datum/spellbook/student - -/datum/spellbook/student - name = "\improper Student's Spellbook" - feedback = "ST" - desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'." - book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic." - title = "Book of Spells and Education" - title_desc = "Hello. Congratulations on becoming a wizard. You may be asking yourself: What? A wizard? Already? Of course! Anybody can become a wizard! Learning to be a good one is the hard part.
Without further adue, let us begin by learning the three concepts of wizardry, 'Spell slots', 'Spells', and 'Artifacts'.
Firstly lets try to understand the 'spell slot'. A spell slot is the measurable amount of spells and artifacts one tome can give. Most spells will only take up a singular spell slot, however more powerful spells/artifacts can take up more.
Spells are spells. They can have requirements, such as wizard garb, and most can be upgraded by purchasing additional spell slots for them. Most upgrades fall into two categories, 'Speed' and 'Power'. Speed upgrades decrease the time you have to spend recharging your spell. Power increases the potency of your spells. Spells are also special in that they can be refunded while inside the Wizard Acadamy, so if you want to test a spell out before moving out into the field, feel free to do that in the comfort of our home.
Artifacts, or 'Artefacts' as we call them, are powerful wizard tools or items made specially for wizards everywhere. Extremely potent, they cannot be refunded like spells, and some of them can be used by non-wizards, so be careful!
Knowing these three concepts puts you in a league above most wizards, however knowledge of spells is just as important so we've included a list of spells below made specifically for the beginning wizard. Take all of them, or mix and match, remember being creative is half of being a wizard!" - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 5 - - spells = list( - /spell/aoe_turf/knock = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/projectile/magic_missile = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/contract/wizard/xray = 1 - ) - -/datum/spellbook/student/apprentice - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE|NOREVERT|NO_LOCKING - -/obj/item/book/spell/apprentice - spellbook_type = /datum/spellbook/student/apprentice diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm deleted file mode 100644 index 705d97399c70..000000000000 --- a/code/modules/spells/targeted/analyze.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/analyze - name = "Analyze" - desc = "Using your wizardly powers, you can detect the inner destructions of a persons body." - - feedback = "AZ" - school = "illusion" - charge_max = 100 - spell_flags = INCLUDEUSER|SELECTABLE - range = 2 - invocation_type = SpI_WHISPER - invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/human) - hud_state = "analyze" - -/spell/targeted/analyze/cast(var/list/targets, var/mob/user) - for(var/a in targets) - var/mob/living/human/H = a - new /obj/effect/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") - to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm deleted file mode 100644 index 4c39b3b4620b..000000000000 --- a/code/modules/spells/targeted/blood_boil.dm +++ /dev/null @@ -1,25 +0,0 @@ -/spell/targeted/blood_boil - name = "Blood Boil" - desc = "Allow you to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - feedback = "BO" - school = "transmutation" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 50 - number_of_channels = 0 - - hud_state = "wiz_boilblood" - -/spell/targeted/blood_boil/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - H.bodytemperature += 40 - if(prob(10)) - to_chat(H,"\The [user] seems to radiate an uncomfortable amount of heat your direction.") - if(H.bodytemperature > H.get_mob_temperature_threshold(HEAT_LEVEL_3)) //Burst into flames - H.fire_stacks += 50 - H.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/targeted/cleric_spells.dm b/code/modules/spells/targeted/cleric_spells.dm deleted file mode 100644 index 74061d776dd6..000000000000 --- a/code/modules/spells/targeted/cleric_spells.dm +++ /dev/null @@ -1,248 +0,0 @@ -/spell/targeted/heal_target - name = "Cure Light Wounds" - desc = "a rudimentary spell used mainly by wizards to heal papercuts. Does not require wizard garb." - feedback = "CL" - school = "transmutation" - charge_max = 20 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE - invocation = "Di'Nath!" - invocation_type = SpI_SHOUT - range = 2 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 2) - - cooldown_reduc = 50 - hud_state = "heal_minor" - cast_sound = 'sound/magic/staff_healing.ogg' - - amt_dam_brute = -15 - amt_dam_fire = -5 - amt_dam_robo = -4 - effect_state = "green_sparkles" - effect_duration = 5 - - // Vars expect a constant at compile time, so we can't use macros for spans here - message = "You feel a pleasant rush of heat move through your body." - -/spell/targeted/heal_target/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 7 - return "[src] will now heal more." - -/spell/targeted/heal_target/touch - name = "Healing Touch" - desc = "Heals an adjacent target for a reasonable amount of health." - range = 1 - amt_dam_fire = -7 - amt_dam_brute = -7 - amt_dam_robo = -5 - charge_max = 10 SECONDS - spell_flags = SELECTABLE - invocation = "Di'Na!" - - hud_state = "heal_touch" - -/spell/targeted/heal_target/major - name = "Cure Major Wounds" - desc = "A spell used to fix others that cannot be fixed with regular medicine." - feedback = "CM" - charge_max = 30 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES - invocation = "Borv Di'Nath!" - range = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 100 - hud_state = "heal_major" - - amt_dam_brute = -75 - amt_dam_fire = -50 - amt_dam_robo = -10 - amt_blood = 28 - - message = "Your body feels like a warm, cozy fire." - -/spell/targeted/heal_target/major/empower_spell() - if(!..()) - return 0 - amt_blood = 28 - amt_organ = 5 - amt_brain = -5 - amt_radiation = -25 - amt_dam_tox = -20 - amt_dam_oxy = -14 - amt_dam_brute = -35 - amt_dam_fire = -35 - amt_dam_robo = -15 - - return "[src] heals more, and heals organ damage and radiation." - -/spell/targeted/heal_target/area - name = "Cure Area" - desc = "This spell heals everyone in an area." - feedback = "HA" - charge_max = 1 MINUTE - spell_flags = INCLUDEUSER - invocation = "Nal Di'Nath!" - range = 2 - max_targets = 0 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 300 - hud_state = "heal_area" - amt_dam_robo = -6 - amt_dam_brute = -25 - amt_dam_fire = -25 - -/spell/targeted/heal_target/area/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 4 - range += 2 - - return "[src] now heals more in a wider area." - -/spell/targeted/heal_target/area/slow - charge_max = 2 MINUTES - -/spell/targeted/heal_target/sacrifice - name = "Sacrifice" - desc = "This spell heals immensily. For a price. Does not require wizard garb." - feedback = "SF" - spell_flags = SELECTABLE - invocation = "Ei'Nath Borv Di'Nath!" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 100 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - amt_blood = 280 - effect_color = "#ff0000" - - hud_state = "gen_dissolve" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/heal_target/sacrifice/empower_spell() - if(!..()) - return 0 - - amt_organ = 25 - amt_brain = -25 - amt_radiation = -100 - - - return "You will now heal organ and brain damage, as well as virtually purge all radiation." - - -/spell/targeted/heal_target/trance - name = "Trance" - desc = "A mighty spell of restoration that briefly forces its target into a deep, dreamless sleep, rapidly repairing their body and soul as their senses are dulled. The users of this mighty art are known for being short lived, slowly devolving into raving madness as the power they once relied on fails them with excessive use." - feedback = "TC" - spell_flags = SELECTABLE - invocation = "Di' Dae Nath!" - charge_max = 2 MINUTES - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - hud_state = "trance" - var/obj/effect/effect - -/spell/targeted/heal_target/trance/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - var/turf/T = get_turf(L) - effect = new /obj/effect/rift(T) - effect.color = "f0e68c" - L.forceMove(effect) - var/time = (L.get_damage(BRUTE) + L.get_damage(BURN)) * 20 - L.status_flags &= GODMODE - to_chat(L,"You will be in stasis for [time/10] second\s.") - addtimer(CALLBACK(src,PROC_REF(cancel_rift)),time) - -/spell/targeted/heal_target/trance/Destroy() - cancel_rift() - return ..() - -/spell/targeted/heal_target/trance/proc/cancel_rift() - if(effect) - var/mob/living/L = locate() in effect - L.status_flags &= ~GODMODE - L.forceMove(get_turf(L)) - apply_spell_damage(L) - charge_max += 300 - QDEL_NULL(effect) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() - -/spell/targeted/revoke - name = "Revoke Death" - desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." - feedback = "RK" - - spell_flags = SELECTABLE - - charge_type = Sp_CHARGES - charge_max = 1 - invocation = "Di Le Nal Yen Nath!" - invocation_type = SpI_SHOUT - range = 1 - hud_state = "heal_revoke" - -/spell/targeted/revoke/cast(var/list/targets, var/mob/living/user) - if(alert(user, "Are you sure?", "Alert", "Yes", "No") == "Yes" && alert(user, "Are you ABSOLUTELY SURE?", "Alert", "Absolutely!", "No") == "Absolutely!") - var/should_wait = 1 - for(var/t in targets) - var/mob/living/M = t - M.rejuvenate() - if(M.client) //We've got a dude - should_wait = 0 - break //Don't need to check anymore. - if(should_wait) - addtimer(CALLBACK(src,PROC_REF(check_for_revoke),targets), 30 SECONDS) - else - revoke_spells() - - -/spell/targeted/revoke/proc/check_for_revoke(var/list/targets) - for(var/t in targets) - var/mob/M = t - if(M.client) - revoke_spells() - return - charge_counter = charge_max - to_chat(holder,"\The [src] refreshes as it seems it could not bring back the souls of those you healed.") - -/spell/targeted/revoke/proc/revoke_spells() - if(!isliving(holder)) - return - var/mob/living/M = holder - if(M.mind) - for(var/s in M.mind.learned_spells) - if(istype(s, /spell/toggle_armor)) //Can keep the armor n junk. - continue - M.remove_spell(s) - for(var/a in M.auras) - M.remove_aura(a) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm deleted file mode 100644 index 65ed431693bf..000000000000 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ /dev/null @@ -1,69 +0,0 @@ -/spell/targeted/equip_item/burning_hand - name = "Burning Hand" - desc = "Bathes your hand in fire, giving you all the perks and disadvantages that brings." - feedback = "BH" - school = "conjuration" - invocation = "Horila Kiha!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 0 - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/burning_hands) - delete_old = 0 - hud_state = "gen_burnhand" - -/obj/item/burning_hands - name = "Burning Hand" - icon = 'icons/mob/screen/grabs.dmi' - icon_state = "grabbed+1" - _base_attack_force = 10 - atom_damage_type = BURN - simulated = 0 - max_health = ITEM_HEALTH_NO_DAMAGE - obj_flags = OBJ_FLAG_NO_STORAGE - var/burn_power = 0 - var/burn_timer - -/obj/item/burning_hands/on_picked_up(var/mob/user) - burn_power = 0 - burn_timer = world.time + 10 SECONDS - START_PROCESSING(SSobj,src) - -/obj/item/burning_hands/get_heat() - return 1000 - -/obj/item/burning_hands/isflamesource() - return TRUE - -/obj/item/burning_hands/Process() - if(world.time < burn_timer) - return - burn_timer = world.time + 5 SECONDS - burn_power++ - set_base_attack_force(get_base_attack_force()+2) - if(!ishuman(src.loc)) - qdel(src) - return - var/mob/living/human/user = src.loc - var/obj/item/organ/external/hand - if(src == user.get_equipped_item(BP_L_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_L_HAND) - else if(src == user.get_equipped_item(BP_R_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_R_HAND) - if(hand) - hand.take_external_damage(burn = 2 * burn_power) - if(burn_power > 5) - user.fire_stacks += 15 - user.IgniteMob() - user.visible_message("\The [user] bursts into flames!") - user.drop_from_inventory(src) - else - if(burn_power == 5) - to_chat(user, "You begin to lose control of \the [src]'s flames as they rapidly move up your arm...") - else - to_chat(user, "You feel \the [src] grow hotter and hotter!") - -/obj/item/burning_hands/dropped() - ..() - qdel(src) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm deleted file mode 100644 index 71d7ace1e4f0..000000000000 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/targeted/equip_item/dyrnwyn - name = "Summon Dyrnwyn" - desc = "Summons the legendary sword of Rhydderch Hael, said to draw in flame when held by a worthy man." - feedback = "SD" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 10 - school = "conjuration" - invocation = "Anrhydeddu Fi!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - duration = 300 //30 seconds - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/sword) - delete_old = FALSE - var/material = /decl/material/solid/metal/gold - - hud_state = "gen_immolate" - - -/spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) - var/obj/item/sword = new new_type(null,material) - sword.SetName("\improper Dyrnwyn") - sword.atom_damage_type = BURN - sword.hitsound = 'sound/items/welder2.ogg' - LAZYSET(sword.slowdown_per_slot, BP_L_HAND, 1) - LAZYSET(sword.slowdown_per_slot, BP_R_HAND, 1) - return sword - -/spell/targeted/equip_item/dyrnwyn/empower_spell() - if(!..()) - return FALSE - - material = /decl/material/solid/metal/silver - return "Dyrnwyn has been made pure: it is now made of silver." diff --git a/code/modules/spells/targeted/equip/equip.dm b/code/modules/spells/targeted/equip/equip.dm deleted file mode 100644 index 7b0304d9e076..000000000000 --- a/code/modules/spells/targeted/equip/equip.dm +++ /dev/null @@ -1,38 +0,0 @@ -//You can set duration to 0 to have the items last forever - -/spell/targeted/equip_item - cast_sound = 'sound/magic/summonitems_generic.ogg' - var/list/equipped_summons = list() //assoc list of text ids and paths to spawn - var/list/summoned_items = list() //list of items we summoned and will dispose when the spell runs out - var/delete_old = 1 //if the item previously in the slot is deleted - otherwise, it's dropped - -/spell/targeted/equip_item/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/L in targets) - for(var/slot_id in equipped_summons) - var/to_create = equipped_summons[slot_id] - if(cmptext(slot_id,"active hand")) - slot_id = user.get_active_held_item_slot() - else if(cmptext(slot_id, "off hand")) - slot_id = user.get_empty_hand_slot() - else - slot_id = text2num(slot_id) //because the index is text, we access this instead - var/obj/item/new_item = summon_item(to_create) - var/obj/item/old_item = L.get_equipped_item(slot_id) - if(old_item) - L.drop_from_inventory(old_item) - if(delete_old) - qdel(old_item) - L.equip_to_slot(new_item, slot_id) - new_item.on_picked_up(L) - - if(duration) - summoned_items += new_item //we store it in a list to remove later - - if(duration) - spawn(duration) - for(var/obj/item/to_remove in summoned_items) - qdel(to_remove) - -/spell/targeted/equip_item/proc/summon_item(var/newtype) - return new newtype diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm deleted file mode 100644 index 7c6dadf5da26..000000000000 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/equip_item/holy_relic - name = "Summon Holy Relic" - desc = "This spell summons a relic of purity into your hand for a short while. The relic will disrupt occult and magical energies - be wary, as this includes your own." - feedback = "SR" - school = "conjuration" - charge_type = Sp_RECHARGE - spell_flags = NEEDSCLOTHES | INCLUDEUSER - invocation = "Yee'Ro Su!" - invocation_type = SpI_SHOUT - range = 0 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - charge_max = 60 SECONDS - duration = 25 SECONDS - cooldown_min = 35 SECONDS - delete_old = 0 - compatible_mobs = list(/mob/living/human) - - hud_state = "purge1" - - equipped_summons = list("active hand" = /obj/item/nullrod) - -/spell/targeted/equip_item/holy_relic/cast(list/targets, mob/user = usr) - ..() - for(var/mob/M in targets) - M.visible_message(SPAN_DANGER("A rod of metal appears in \the [M]'s hand!")) - -/spell/targeted/equip_item/holy_relic/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "The holy relic now lasts for [duration/10] seconds." \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm deleted file mode 100644 index 31995ba86bd0..000000000000 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/targeted/equip_item/horsemask - name = "Curse of the Horseman" - desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." - school = "transmutation" - charge_type = Sp_RECHARGE - charge_max = 150 - charge_counter = 0 - spell_flags = 0 - invocation = "Kn'a Ftaghu, Puck'Bthnk!" - invocation_type = SpI_SHOUT - range = 7 - max_targets = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 30 //30 deciseconds reduction per rank - selection_type = "range" - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/horsehead_curse.ogg' - -/spell/targeted/equip_item/horsemask/New() - ..() - equipped_summons = list("[slot_wear_mask_str]" = /obj/item/clothing/mask/horsehead) - -/spell/targeted/equip_item/horsemask/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/target in targets) - target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ - "Your face burns up, and shortly after the fire you realise you have the face of a horse!") - target.flash_eyes() - -/spell/targeted/equip_item/horsemask/summon_item(var/new_type) - var/obj/item/new_item = new new_type - new_item.canremove = 0 //curses! - if(istype(new_item, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/magichead = new_item - magichead.flags_inv = null //so you can still see their face - magichead.voicechange = 1 //NEEEEIIGHH - return new_item - -/spell/targeted/equip_item/horsemask/empower_spell() - if(!..()) - return 0 - - spell_flags = SELECTABLE - - return "You can now select your target with [src]" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm deleted file mode 100644 index f6f7ba54d071..000000000000 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/targeted/equip_item/party_hardy - name = "Summon Party" - desc = "This spell was invented for the sole purpose of getting crunked at 11am on a Tuesday. Does not require wizard garb." - feedback = "PY" - school = "conjuration" - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 600 - spell_flags = INCLUDEUSER - invocation = "Llet'Su G'iit Rrkned!" //Let's get wrecked. - invocation_type = SpI_SHOUT - range = 6 - max_targets = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 2) - delete_old = 0 - - hud_state = "wiz_party" - - compatible_mobs = list(/mob/living/human) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer) - -/spell/targeted/equip_item/party_hardy/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer, - "off hand" = /obj/item/food/poppypretzel) - return "The spell will now give everybody a preztel as well." - if(2) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/absinthe, - "off hand" = /obj/item/food/poppypretzel, - "[slot_head_str]" = /obj/item/clothing/head/collectable/wizard) - return "Woo! Now everybody gets a cool wizard hat and MORE BOOZE!" - - return 0 \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm deleted file mode 100644 index 2252ec75c8c0..000000000000 --- a/code/modules/spells/targeted/equip/seed.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/targeted/equip_item/seed - name = "Summon Seed" - desc = "This spell summons a random seed into the hand of the wizard." - feedback = "SE" - delete_old = 0 - - spell_flags = INCLUDEUSER | NEEDSCLOTHES - invocation_type = SpI_WHISPER - invocation = "Ria'li akta." - - equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/human) - - charge_max = 600 //1 minute - cooldown_min = 200 //20 seconds - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 0) - - range = -1 - max_targets = 1 - - hud_state = "wiz_seed" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm deleted file mode 100644 index b725196ad3a6..000000000000 --- a/code/modules/spells/targeted/equip/shield.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/equip_item/shield - name = "Summon Shield" - desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots." - feedback = "SH" - school = "conjuration" - invocation = "Sia helda!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER | NEEDSCLOTHES - range = -1 - max_targets = 1 - - compatible_mobs = list(/mob/living/human) - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 300 - equipped_summons = list("off hand" = /obj/item/shield/) - duration = 300 - delete_old = 0 - var/item_color = "#6666ff" - var/block_chance = 30 - - hud_state = "wiz_shield" - -/spell/targeted/equip_item/shield/summon_item(var/new_type) - var/obj/item/shield/I = new new_type() - I.icon_state = "buckler" - I.color = item_color - I.SetName("Wizard's Shield") - I.base_block_chance = block_chance - return I - -/spell/targeted/equip_item/shield/empower_spell() - if(!..()) - return 0 - - item_color = "#6600ff" - block_chance = 60 - - return "Your summoned shields will now block more often." diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm index e686e7712dc5..55a0ed83359d 100644 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ b/code/modules/spells/targeted/ethereal_jaunt.dm @@ -4,7 +4,7 @@ feedback = "EJ" school = "transmutation" charge_max = 30 SECONDS - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER + spell_flags = Z2NOCAST | INCLUDEUSER invocation = "none" invocation_type = SpI_NONE range = 0 @@ -31,7 +31,7 @@ animation.anchored = TRUE animation.icon = 'icons/mob/mob.dmi' animation.layer = FLY_LAYER - target.ExtinguishMob() + target.extinguish_fire() if(target.buckled) target.buckled = null jaunt_disappear(animation, target) diff --git a/code/modules/spells/targeted/exude_pleasantness.dm b/code/modules/spells/targeted/exude_pleasantness.dm deleted file mode 100644 index 74ae51237ab7..000000000000 --- a/code/modules/spells/targeted/exude_pleasantness.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/exude_pleasantness - name = "Exhude Pleasantness" - desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect" - feedback = "AP" - school = "Illusion" - spell_flags = INCLUDEUSER - range = 5 - max_targets = 0 - charge_max = 100 - var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") - hud_state = "friendly" - -/spell/targeted/exude_pleasantness/cast(var/list/targets, var/mob/user) - for(var/m in targets) - var/mob/living/L = m - if(L.mind && L.mind.assigned_special_role == "Spellbound Servant") - to_chat(m, SPAN_NOTICE("\The [user] seems relatively harmless.")) - else - to_chat(m, FONT_LARGE(SPAN_NOTICE("\The [user] [pick(possible_messages)]"))) \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm deleted file mode 100644 index bcc5233b9b65..000000000000 --- a/code/modules/spells/targeted/genetic.dm +++ /dev/null @@ -1,73 +0,0 @@ -/* -Other mutation or disability spells can be found in -code\game\dna\genes\vg_powers.dm -code\game\dna\genes\goon_disabilities.dm -code\game\dna\genes\goon_powers.dm -*/ -/spell/targeted/genetic - name = "Genetic modifier" - desc = "This spell inflicts a set of genetic conditions upon the target." - duration = 10 SECONDS - var/list/genetic_conditions = list() - -/spell/targeted/genetic/cast(list/targets) - ..() - for(var/mob/living/target in targets) - for(var/x in genetic_conditions) - target.add_genetic_condition(x, duration) - -/spell/targeted/genetic/blind - name = "Blind" - desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." - feedback = "BD" - school = "illusion" - duration = 300 - charge_max = 300 - spell_flags = 0 - invocation = "Sty Kaly." - invocation_type = SpI_WHISPER - message = "Your eyes cry out in pain!" - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) - cooldown_min = 50 - range = 7 - max_targets = 0 - amt_eye_blind = 10 - amt_eye_blurry = 20 - hud_state = "wiz_blind" - cast_sound = 'sound/magic/blind.ogg' - genetic_conditions = list(GENE_COND_BLINDED) - -/spell/targeted/genetic/blind/empower_spell() - if(!..()) - return 0 - duration += 10 SECONDS - return "[src] will now blind for a longer period of time." - -/spell/targeted/genetic/blind/hysteria - name = "Hysteria" - desc = "A spell used to make someone look like a blind fool, and also makes them a blind fool." - feedback = "HY" - school = "illusion" - spell_flags = SELECTABLE - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Sty Di Kaly!" - amt_dizziness = 10 - hud_state = "hysteria" - -/spell/targeted/genetic/blind/starburst - name = "Starburst" - desc = "Send a jolt of electricity through everyone's nerve center, blinding and stunning them." - feedback = "SB" - school = "transmutation" - invocation = "Tid Caeh Yor!" - spell_flags = NOFACTION - invocation_type = SpI_SHOUT - charge_max = 60 SECONDS - spell_flags = 0 - amt_dizziness = 0 - amt_eye_blurry = 5 - amt_stunned = 1 - effect_state = "electricity_constant" - effect_duration = 5 - hud_state = "wiz_starburst" diff --git a/code/modules/spells/targeted/glimpse_of_eternity.dm b/code/modules/spells/targeted/glimpse_of_eternity.dm deleted file mode 100644 index a4d783245ab9..000000000000 --- a/code/modules/spells/targeted/glimpse_of_eternity.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/targeted/glimpse_of_eternity - name = "Glimpse of Eternity" - desc = "Show the non-believers what enlightenment truely means." - feedback = "GE" - school = "illusion" - invocation = "Ghe Tar Yet!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - max_targets = 0 - charge_max = 400 - range = 3 - - hud_state = "wiz_glimpse" - -/spell/targeted/glimpse_of_eternity/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - if(L.faction != user.faction) //Worse for non-allies - SET_STATUS_MAX(L, STAT_BLIND, 5) - SET_STATUS_MAX(L, STAT_STUN, 5) - new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "electricity_constant") - else - SET_STATUS_MAX(L, STAT_BLIND, 2) - L.heal_damage(BRUTE, 10, do_update_health = FALSE) - L.heal_damage(BURN, 10) - new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "green_sparkles") \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/dumbfire.dm b/code/modules/spells/targeted/projectile/dumbfire.dm deleted file mode 100644 index 491a5f00f99e..000000000000 --- a/code/modules/spells/targeted/projectile/dumbfire.dm +++ /dev/null @@ -1,13 +0,0 @@ -/spell/targeted/projectile/dumbfire - selection_type = "range" - -/spell/targeted/projectile/dumbfire/choose_targets(mob/user = usr) - var/list/targets = list() - - var/starting_dir = user.dir //where are we facing at the time of casting? - var/turf/starting_turf = get_turf(user) - var/current_turf = starting_turf - for(var/i = 1; i <= src.range; i++) - current_turf = get_step(current_turf, starting_dir) - targets += current_turf - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm deleted file mode 100644 index ef65dc885f73..000000000000 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/targeted/projectile/dumbfire/fireball - name = "Fireball" - desc = "A classic spell, grants you the ability to throw an exploding ball of flame in any direction. Does not require wizard garb." - feedback = "FB" - proj_type = /obj/item/projectile/spell_projectile/fireball - - school = "conjuration" - charge_max = 10 SECONDS - spell_flags = 0 - invocation = "Oni-Soma!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 5, Sp_SPEED = 0, Sp_POWER = 5) - - duration = 20 - proj_step_delay = 1 - - amt_dam_brute = 20 - amt_dam_fire = 25 - - var/ex_severe = -1 - var/ex_heavy = 1 - var/ex_light = 2 - var/ex_flash = 5 - - hud_state = "wiz_fireball" - cast_sound = 'sound/magic/fireball.ogg' - -/spell/targeted/projectile/dumbfire/fireball/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - apply_spell_damage(M) - explosion(get_turf(spell_holder), ex_severe, ex_heavy, ex_light, ex_flash) - -/spell/targeted/projectile/dumbfire/fireball/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER]%2 == 1) - ex_severe++ - ex_heavy++ - ex_light++ - ex_flash++ - - return "The spell [src] now has a larger explosion." - -//PROJECTILE - -/obj/item/projectile/spell_projectile/fireball - name = "fireball" - icon_state = "fireball" - -/spell/targeted/projectile/dumbfire/fireball/firebolt - name = "Firebolt" - desc = "A quick-casted fireball. Burns the user, and their enemies, but is much faster to shoot." - feedback = "FO" - charge_type = Sp_HOLDVAR - invocation = "Ignus!" - holder_var_type = "fireloss" - holder_var_amount = 10 - amt_dam_brute = 10 - amt_dam_fire = 15 - ex_heavy = -1 - ex_light = 1 - ex_flash = 3 - hud_state = "firebolt" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/magic_missile.dm b/code/modules/spells/targeted/projectile/magic_missile.dm deleted file mode 100644 index 1d72399718a9..000000000000 --- a/code/modules/spells/targeted/projectile/magic_missile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/spell/targeted/projectile/magic_missile - name = "Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - feedback = "MM" - school = "conjuration" - charge_max = 150 - spell_flags = NEEDSCLOTHES - invocation = "Forti Gy-Ama!" - invocation_type = SpI_SHOUT - range = 7 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 90 //15 deciseconds reduction per rank - - max_targets = 0 - - proj_type = /obj/item/projectile/spell_projectile/seeking/magic_missile - duration = 10 - proj_step_delay = 5 - - hud_state = "wiz_mm" - cast_sound = 'sound/magic/magic_missile.ogg' - amt_paralysis = 3 - amt_stunned = 3 - - amt_dam_fire = 10 - -/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) - spell_holder.visible_message("\The [spell_holder] pops with a flash!") - playsound(src, 'sound/magic/mm_hit.ogg', 40) - for(var/mob/living/M in targets) - apply_spell_damage(M) - return - -/spell/targeted/projectile/magic_missile/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - amt_paralysis += 2 - amt_stunned += 2 - return "[src] will now stun people for a longer duration." - amt_dam_fire += 5 - - return "[src] does more damage now." - - - -//PROJECTILE - -/obj/item/projectile/spell_projectile/seeking/magic_missile - name = "magic missile" - icon_state = "magicm" - - proj_trail = 1 - proj_trail_lifespan = 5 - proj_trail_icon_state = "magicmd" diff --git a/code/modules/spells/targeted/projectile/passage.dm b/code/modules/spells/targeted/projectile/passage.dm deleted file mode 100644 index b99e147bee22..000000000000 --- a/code/modules/spells/targeted/projectile/passage.dm +++ /dev/null @@ -1,46 +0,0 @@ -/spell/targeted/projectile/dumbfire/passage - name = "Passage" - desc = "throw a spell towards an area and teleport to it." - feedback = "PA" - proj_type = /obj/item/projectile/spell_projectile/passage - - - school = "conjuration" - charge_max = 250 - invocation = "A'YASAMA" - invocation_type = SpI_SHOUT - range = 15 - - - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - spell_flags = NEEDSCLOTHES - duration = 15 - - proj_step_delay = 1 - - hud_state = "gen_project" - cast_sound = 'sound/magic/lightning_bolt.ogg' - -/spell/targeted/projectile/dumbfire/passage/prox_cast(var/list/targets, atom/spell_holder) - for(var/mob/living/L in targets) - apply_spell_damage(L) - - var/turf/T = get_turf(spell_holder) - - holder.forceMove(T) - var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread() - S.set_up(3,0,T) - S.start() - playsound(src, 'sound/magic/lightningshock.ogg', 50) - -/spell/targeted/projectile/dumbfire/passage/empower_spell() - if(!..()) - return 0 - - amt_stunned += 3 - - return "[src] now stuns those who get hit by it." - -/obj/item/projectile/spell_projectile/passage - name = "spell" - icon_state = "energy2" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm deleted file mode 100644 index 6df791094be2..000000000000 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* -Projectile spells make special projectiles (obj/item/spell_projectile) and fire them at targets -Dumbfire projectile spells fire directly ahead of the user -spell_projectiles call their spell's (carried) prox_cast when they get in range of a target -If the spell_projectile is seeking, it will update its target every process and follow them -*/ - -/spell/targeted/projectile - range = 7 - var/proj_type = /obj/item/projectile/spell_projectile //use these. They are very nice - var/proj_step_delay = 1 //lower = faster - var/cast_prox_range = 1 - -/spell/targeted/projectile/cast(list/targets, mob/user = usr) - for(var/atom/target in targets) - var/obj/item/projectile/projectile = new proj_type(user.loc, user.dir) - - if(!projectile) - return - - if(istype(projectile, /obj/item/projectile/spell_projectile)) - var/obj/item/projectile/spell_projectile/SP = projectile - SP.carried = src //casting is magical - projectile.original = target - projectile.starting = get_turf(user) - projectile.shot_from = user //fired from the user - projectile.current = projectile.original - projectile.yo = target.y - user.y - projectile.xo = target.x - user.x - projectile.life_span = src.duration - projectile.hitscan = !proj_step_delay - projectile.step_delay = proj_step_delay - projectile.launch(target) - return - -/spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) - var/list/targets = list() - for(var/mob/living/M in range(spell_holder, cast_prox_range)) - if(M == user && !(spell_flags & INCLUDEUSER)) - continue - targets += M - return targets - -/spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm deleted file mode 100644 index 520463815888..000000000000 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ /dev/null @@ -1,47 +0,0 @@ -/spell/targeted/projectile/dumbfire/stuncuff - name = "Stun Cuff" - desc = "This spell fires out a small curse that stuns and cuffs the target." - feedback = "SC" - proj_type = /obj/item/projectile/spell_projectile/stuncuff - - charge_type = Sp_CHARGES - charge_max = 6 - charge_counter = 6 - spell_flags = 0 - invocation = "Fu'Reai Diakan!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0) - - duration = 20 - proj_step_delay = 1 - - amt_stunned = 6 - - hud_state = "wiz_cuff" - cast_sound = 'sound/magic/wandodeath.ogg' - -/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - if(ishuman(M)) - var/mob/living/human/H = M - var/obj/item/handcuffs/wizard/cuffs = new() - H.equip_to_slot(cuffs, slot_handcuffed_str) - H.visible_message("Beams of light form around \the [H]'s hands!") - apply_spell_damage(M) - - -/obj/item/handcuffs/wizard - name = "beams of light" - desc = "Undescribable and unpenetrable. Or so they say." - - breakouttime = 300 //30 seconds - -/obj/item/handcuffs/wizard/dropped(var/mob/user) - ..() - qdel(src) - -/obj/item/projectile/spell_projectile/stuncuff - name = "stuncuff" - icon_state = "spell" \ No newline at end of file diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm deleted file mode 100644 index ae5de55a0f76..000000000000 --- a/code/modules/spells/targeted/shapeshift.dm +++ /dev/null @@ -1,203 +0,0 @@ -//basic transformation spell. Should work for most simple_animals - -/spell/targeted/shapeshift - name = "Shapeshift" - desc = "This spell transforms the target into something else for a short while." - - school = "transmutation" - - charge_type = Sp_RECHARGE - charge_max = 600 - - duration = 0 //set to 0 for permanent. - - var/list/possible_transformations = list() - var/list/newVars = list() //what the variables of the new created thing will be. - - cast_sound = 'sound/magic/charge.ogg' - var/revert_sound = 'sound/magic/charge.ogg' //the sound that plays when something gets turned back. - var/share_damage = 1 //do we want the damage we take from our new form to move onto our real one? (Only counts for finite duration) - var/drop_items = 1 //do we want to drop all our items when we transform? - var/toggle = 0 //Can we toggle this? - var/list/transformed_dudes = list() //Who we transformed. Transformed = Transformation. Both mobs. - -/spell/targeted/shapeshift/cast(var/list/targets, mob/user) - for(var/m in targets) - var/mob/living/M = m - if(M.stat == DEAD) - to_chat(user, "[name] can only transform living targets.") - continue - if(M.buckled) - M.buckled.unbuckle_mob() - if(toggle && transformed_dudes.len && stop_transformation(M)) - continue - var/new_mob = pick(possible_transformations) - - var/mob/living/trans = new new_mob(get_turf(M)) - for(var/varName in newVars) //stolen shamelessly from Conjure - if(varName in trans.vars) - trans.vars[varName] = newVars[varName] - //Give them our languages - for(var/decl/language/lang as anything in M.languages) - trans.add_language(lang.type) - - trans.SetName("[trans.name] ([M])") - if(ishuman(M) && drop_items) - for(var/obj/item/I in M.contents) - M.drop_from_inventory(I) - if(M.mind) - M.mind.transfer_to(trans) - else - trans.key = M.key - new /obj/effect/temporary(get_turf(M), 5, 'icons/effects/effects.dmi', "summoning") - - M.forceMove(trans) //move inside the new dude to hide him. - M.status_flags |= GODMODE //dont want him to die or breathe or do ANYTHING - transformed_dudes[trans] = M - events_repository.register(/decl/observ/death, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) - events_repository.register(/decl/observ/destroyed, trans,src, TYPE_PROC_REF(/spell/targeted/shapeshift, stop_transformation)) - events_repository.register(/decl/observ/destroyed, M, src, TYPE_PROC_REF(/spell/targeted/shapeshift, destroyed_transformer)) - if(duration) - spawn(duration) - stop_transformation(trans) - -/spell/targeted/shapeshift/proc/destroyed_transformer(var/mob/target) //Juuuuust in case - var/mob/current = transformed_dudes[target] - to_chat(current, "You suddenly feel as if this transformation has become permanent...") - remove_target(target) - -/spell/targeted/shapeshift/proc/stop_transformation(var/mob/living/target) - var/mob/living/transformer = transformed_dudes[target] - if(!transformer) - return FALSE - transformer.status_flags &= ~GODMODE - if(share_damage) - var/transformer_max_health = transformer.get_max_health() - var/damage = transformer.set_max_health(transformer_max_health-round(transformer_max_health*(transformer.get_health_ratio()))) - for(var/i in 1 to ceil(damage/10)) - transformer.take_damage(10) - if(target.mind) - target.mind.transfer_to(transformer) - else - transformer.key = target.key - playsound(get_turf(target), revert_sound, 50, 1) - transformer.forceMove(get_turf(target)) - remove_target(target) - qdel(target) - return TRUE - -/spell/targeted/shapeshift/proc/remove_target(var/mob/living/target) - var/mob/current = transformed_dudes[target] - events_repository.unregister(/decl/observ/destroyed, target,src) - events_repository.unregister(/decl/observ/death, current,src) - events_repository.unregister(/decl/observ/destroyed, current,src) - transformed_dudes[target] = null - transformed_dudes -= target - -/spell/targeted/shapeshift/baleful_polymorph - name = "Baleful Polymorth" - desc = "This spell transforms its target into a small, furry animal." - feedback = "BP" - possible_transformations = list( - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/passive/mouse, - /mob/living/simple_animal/passive/mouse/rat, - /mob/living/simple_animal/corgi - ) - - share_damage = 0 - invocation = "Yo'balada!" - invocation_type = SpI_SHOUT - spell_flags = NEEDSCLOTHES | SELECTABLE - range = 3 - duration = 150 //15 seconds. - cooldown_min = 200 //20 seconds - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("health" = 50, "max_health" = 50) - - hud_state = "wiz_poly" - - -/spell/targeted/shapeshift/baleful_polymorph/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "Your target will now stay in their polymorphed form for [duration/10] seconds." - -/spell/targeted/shapeshift/avian - name = "Polymorph" - desc = "This spell transforms the wizard into the common parrot." - feedback = "AV" - possible_transformations = list(/mob/living/simple_animal/hostile/parrot) - - drop_items = 0 - share_damage = 0 - invocation = "Poli'crakata!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 600 - cooldown_min = 300 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) - hud_state = "wiz_parrot" - -/spell/targeted/shapeshift/corrupt_form - name = "Corrupt Form" - desc = "This spell shapes the wizard into a terrible, terrible beast." - feedback = "CF" - possible_transformations = list(/mob/living/simple_animal/hostile/revenant) - - invocation = "mutters something dark and twisted as their form begins to twist..." - invocation_type = SpI_EMOTE - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 1200 - cooldown_min = 600 - - drop_items = 0 - share_damage = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("name" = "corrupted soul") - - hud_state = "wiz_corrupt" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/shapeshift/corrupt_form/empower_spell() - if(!..()) - return 0 - - switch(spell_levels[Sp_POWER]) - if(1) - duration *= 2 - return "You will now stay corrupted for [duration/10] seconds." - if(2) - newVars = list("name" = "\proper corruption incarnate", - "melee_damage_upper" = 25, - "resistance" = 6, - "health" = 125, - "max_health" = 125) - duration = 0 - return "You revel in the corruption. There is no turning back." - -/spell/targeted/shapeshift/familiar - name = "Transform" - desc = "Transform into a familiar form. Literally." - feedback = "FA" - possible_transformations = list() - drop_items = 0 - invocation_type = SpI_EMOTE - invocation = "'s body dissipates into a pale mass of light, then reshapes!" - range = -1 - spell_flags = INCLUDEUSER - duration = 0 - charge_max = 2 MINUTES - toggle = 1 - - hud_state = "wiz_carp" \ No newline at end of file diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm deleted file mode 100644 index f84d6765035d..000000000000 --- a/code/modules/spells/targeted/shatter_mind.dm +++ /dev/null @@ -1,29 +0,0 @@ -/spell/targeted/shatter - name = "Shatter Mind" - desc = "Assaults the mind of the target with fear of the unknown, shattering their sanity and causing brain damage." - feedback = "SM" - school = "illusion" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 150 - number_of_channels = 0 - - hud_state = "wiz_statue" - -/spell/targeted/shatter/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - if(prob(50)) - sound_to(user, get_sfx("swing_hit")) - if(prob(5)) - to_chat(H, "You feel unhinged.") - H.adjust_hallucination(5,5) - ADJ_STATUS(H, STAT_CONFUSE, 2) - ADJ_STATUS(H, STAT_DIZZY, 2) - if(H.hallucination_power > 50) - H.take_damage(5, BRAIN) - to_chat(H, "You feel your mind tearing apart!") \ No newline at end of file diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm index 2b53b60d2441..2bcc684939a6 100644 --- a/code/modules/spells/targeted/shift.dm +++ b/code/modules/spells/targeted/shift.dm @@ -21,4 +21,4 @@ flick("phase_shift2",animation) /spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return \ No newline at end of file + return diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm deleted file mode 100644 index 700dac35b36d..000000000000 --- a/code/modules/spells/targeted/subjugate.dm +++ /dev/null @@ -1,35 +0,0 @@ -/spell/targeted/subjugation - name = "Subjugation" - desc = "This spell temporarily subjugates a target's mind and does not require wizard garb." - feedback = "SJ" - school = "illusion" - charge_max = 500 - spell_flags = NOFACTION - invocation = "Dii Oda Baji." - invocation_type = SpI_WHISPER - - message = "You suddenly feel completely overwhelmed!" - - max_targets = 1 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 0, Sp_POWER = 3) - - amt_dizziness = 100 - amt_confused = 100 - amt_stuttering = 100 - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_subj" - -/spell/targeted/subjugation/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - max_targets = 0 - - return "[src] will now effect everyone in the area." - else - max_targets++ - return "[src] will now effect [max_targets] people." \ No newline at end of file diff --git a/code/modules/spells/targeted/swap.dm b/code/modules/spells/targeted/swap.dm deleted file mode 100644 index 150bd9030772..000000000000 --- a/code/modules/spells/targeted/swap.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/swap - name = "swap" - desc = "This spell swaps the positions of the wizard and a target. Causes brain damage." - feedback = "SW" - school = "conjuration" - - charge_type = Sp_HOLDVAR - holder_var_type = "brainloss" - holder_var_amount = 10 - - invocation = "Joyo!" - invocation_type = SpI_WHISPER - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 0, Sp_POWER = 2) - - spell_flags = Z2NOCAST - range = 6 - max_targets = 1 - compatible_mobs = list(/mob/living) - - hud_state = "wiz_swap" - - cast_sound = 'sound/magic/mandswap.ogg' - -/spell/targeted/swap/cast(var/list/targets, mob/user) - for(var/mob/T in targets) - var/turf/aT = get_turf(T) - var/turf/bT = get_turf(user) - - T.forceMove(bT) - user.forceMove(aT) - - apply_spell_damage(T) - -/spell/targeted/swap/empower_spell() - if(!..()) - return 0 - - amt_eye_blind += 2 - - return "This spell will now blind the target." diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm index 46e6e242b26b..733bbf1e5403 100644 --- a/code/modules/spells/targeted/targeted.dm +++ b/code/modules/spells/targeted/targeted.dm @@ -3,7 +3,6 @@ Targeted spells (with the exception of dumbfire) select from all the mobs in the Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are explained in setup.dm */ - /spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob var/max_targets = 1 //leave 0 for unlimited targets in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast @@ -62,10 +61,6 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp for(var/mob/living/M in starting_targets) if(!(spell_flags & INCLUDEUSER) && M == user) continue - if((spell_flags & NOFACTION) && user.faction == M.faction) - continue - if((spell_flags & NONONFACTION) && user.faction != M.faction) - continue if(compatible_mobs && compatible_mobs.len) if(!is_type_in_list(M, compatible_mobs)) continue if(compatible_mobs && compatible_mobs.len && !is_type_in_list(M, compatible_mobs)) @@ -73,12 +68,7 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp possible_targets += M if(possible_targets.len) - if(spell_flags & SELECTABLE) //if we are allowed to choose. see setup.dm for details - var/mob/temp_target = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(temp_target) - targets += temp_target - else - targets += pick(possible_targets) + targets += pick(possible_targets) //Adds a safety check post-input to make sure those targets are actually in range. @@ -98,28 +88,15 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp continue possible_targets += target - if(spell_flags & SELECTABLE) - for(var/i = 1; i<=max_targets, i++) - if(!possible_targets.len) - break - var/mob/M = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(!M) - break - if(range != -2) - if(!(M in view_or_range(range, holder, selection_type))) - continue - targets += M - possible_targets -= M - else - for(var/i=1,i<=max_targets,i++) - if(!possible_targets.len) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) + for(var/i=1,i<=max_targets,i++) + if(!possible_targets.len) + break + if(target_ignore_prev) + var/target = pick(possible_targets) + possible_targets -= target + targets += target + else + targets += pick(possible_targets) if(!(spell_flags & INCLUDEUSER) && (user in targets)) targets -= user @@ -172,4 +149,4 @@ Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are exp ADJ_STATUS(target, STAT_STUTTER, amt_stuttering) if(effect_state) var/obj/o = new /obj/effect/temporary(get_turf(target), effect_duration, 'icons/effects/effects.dmi', effect_state) - o.color = effect_color \ No newline at end of file + o.color = effect_color diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm deleted file mode 100644 index e98836699f30..000000000000 --- a/code/modules/spells/targeted/torment.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/torment - name = "Torment" - desc = "Darkness stabs at the bodies of those around you. All within a medium range will suffer significant pain." - feedback = "TM" - school = "illusion" - charge_max = 150 - spell_flags = NOFACTION - invocation = "Rai Di-Kaal!" - invocation_type = SpI_SHOUT - range = 5 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - cooldown_min = 50 - message = "So much pain! All you can hear is screaming!" - - max_targets = 0 - compatible_mobs = list(/mob/living/human) - - var/loss = 30 - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/cowhead_curse.ogg' - -/spell/targeted/torment/cast(var/list/targets, var/mob/user) - user.spawn_gibber() - for(var/mob/living/human/H in targets) - H.take_damage(loss, PAIN) - -/spell/targeted/torment/empower_spell() - if(!..()) - return 0 - - loss += 30 - - return "[src] will now cause more pain." \ No newline at end of file diff --git a/code/modules/submaps/_submap.dm b/code/modules/submaps/_submap.dm index 20404728d37b..c2fde5b895d8 100644 --- a/code/modules/submaps/_submap.dm +++ b/code/modules/submaps/_submap.dm @@ -26,7 +26,7 @@ archetype = _archetype if(!pref_name) - pref_name = archetype.descriptor + pref_name = archetype.name testing("Starting submap setup - '[name]', [archetype], [associated_z]z.") @@ -41,7 +41,7 @@ jobs[job.title] = job if(!associated_z) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") qdel(src) return @@ -59,7 +59,7 @@ registered_spawnpoint = TRUE if(!registered_spawnpoint) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] has no job spawn points.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] has no job spawn points.") qdel(src) return diff --git a/code/modules/submaps/submap_archetype.dm b/code/modules/submaps/submap_archetype.dm index be118fa8202b..9597b64f1f6f 100644 --- a/code/modules/submaps/submap_archetype.dm +++ b/code/modules/submaps/submap_archetype.dm @@ -1,5 +1,6 @@ /decl/submap_archetype - var/descriptor = "generic ship archetype" + // TODO: use UID instead of name for pref saving. + var/name = "generic ship archetype" var/list/whitelisted_species = list() var/list/blacklisted_species = list() var/call_webhook @@ -13,12 +14,18 @@ /decl/submap_archetype/validate() . = ..() - if(!descriptor) - . += "no descriptor set" + if(name) + var/static/list/submaps_by_name = list( (global.using_map.name) = global.using_map.type) + if(submaps_by_name[name]) + . += "name '[name]' ([type]) collides with submap type '[submaps_by_name[name]]'" + else + submaps_by_name[name] = type + else + . += "no name set" // Generic ships to populate the list. /decl/submap_archetype/derelict - descriptor = "drifting wreck" + name = "drifting wreck" /decl/submap_archetype/abandoned_ship - descriptor = "abandoned ship" + name = "abandoned ship" diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 49e6622328e8..9bc3687a1aed 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -78,17 +78,17 @@ to_chat(feedback, "Not old enough. Minimum character age is [minimum_character_age[S.get_root_species_name()]].") return TRUE if(LAZYLEN(whitelisted_species) && !(prefs.species in whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(prefs.species in blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(owner && owner.archetype) if(LAZYLEN(owner.archetype.whitelisted_species) && !(prefs.species in owner.archetype.whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE if(prefs.species in owner.archetype.blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE return FALSE diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 56b086005c7f..5cb5d84467e5 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -237,13 +237,13 @@ var/global/list/supermatter_delam_accent_sounds = list( else aw_EPR = FALSE -/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_to_irc = FALSE) +/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_webhook = FALSE) var/status = get_status() if(status >= min_status) if(!current_state) log_and_message_admins(message) - if(send_to_irc) - send2adminirc(message) + if(send_webhook) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Supermatter Warning", "body" = message)) return TRUE else return FALSE diff --git a/code/modules/tools/subtypes/axes.dm b/code/modules/tools/subtypes/axes.dm index 0ef7a384c3d7..94e14da62742 100644 --- a/code/modules/tools/subtypes/axes.dm +++ b/code/modules/tools/subtypes/axes.dm @@ -21,6 +21,9 @@ /obj/item/tool/axe/ebony handle_material = /decl/material/solid/organic/wood/ebony +/obj/item/tool/axe/ebony/bronze + material = /decl/material/solid/metal/bronze + // Legacy SS13 hatchet. /obj/item/tool/axe/hatchet name = "hatchet" diff --git a/code/modules/tools/subtypes/pickaxes.dm b/code/modules/tools/subtypes/pickaxes.dm index 755b9554b41e..083c99661f8c 100644 --- a/code/modules/tools/subtypes/pickaxes.dm +++ b/code/modules/tools/subtypes/pickaxes.dm @@ -75,3 +75,7 @@ /obj/item/tool/pickaxe/iron material = /decl/material/solid/metal/iron handle_material = /decl/material/solid/organic/wood/ebony + +/obj/item/tool/pickaxe/bronze + material = /decl/material/solid/metal/bronze + handle_material = /decl/material/solid/organic/wood/ebony diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 08318914e2e6..a5aa85daf86f 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -63,7 +63,7 @@ usr.visible_message("\The [usr] puts up \the [src]'s kickstand.") else if(isspaceturf(src.loc)) - to_chat(usr, " You don't think kickstands work in space...") + to_chat(usr, "You don't think kickstands work in space...") return usr.visible_message("\The [usr] puts down \the [src]'s kickstand.") diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 342d8dbba7ec..62606d2626bc 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -193,7 +193,7 @@ if(distance > 1) return - if(!ishuman(usr)) + if(!ishuman(user)) return to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index fc8fbe1ee9d9..edfc8efaba4a 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -240,23 +240,23 @@ turn_on() return -/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) +/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/user) if(cell) return if(!istype(C)) return - if(!H.try_unequip(C, src)) + if(!user.try_unequip(C, src)) return cell = C powercheck() - to_chat(usr, "You install [C] in [src].") + to_chat(user, "You install [C] in [src].") -/obj/vehicle/proc/remove_cell(var/mob/living/human/H) +/obj/vehicle/proc/remove_cell(var/mob/living/user) if(!cell) return - to_chat(usr, "You remove [cell] from [src].") - H.put_in_hands(cell) + to_chat(user, "You remove [cell] from [src].") + user.put_in_hands(cell) cell = null powercheck() diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index dd78d0d269b2..9c1a6493a533 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -43,6 +43,13 @@ var/obj/abstract/lightning_overlay/lightning_overlay // A visible atom used for animated lighting effects. var/tmp/list/vis_contents_additions // Holder for a list used to add required atoms to turf vis_contents. + /// A list of particle sources to randomize particle-based effects per-turf. + var/list/obj/abstract/weather_particles/particle_sources = newlist( + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles + ) // Main heartbeat proc, called by SSweather. /obj/abstract/weather_system/proc/tick() @@ -106,3 +113,35 @@ invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE appearance_flags = RESET_COLOR | KEEP_APART + +// Dummy object for weather particles. +/obj/abstract/weather_particles + // plane = EMISSIVE_PLANE + // layer = ABOVE_LIGHTING_LAYER + icon = null + invisibility = INVISIBILITY_NONE + is_spawnable_type = FALSE + appearance_flags = RESET_COLOR | KEEP_APART + layer = ABOVE_HUMAN_LAYER + +/obj/abstract/weather_particles/proc/update_particle_system(obj/abstract/weather_system/holder) + if(!istype(particles, /particles/weather)) + return + var/particles/weather/weather_particles = particles + weather_particles.color = holder.color // sync color + alpha = holder.alpha // sync alpha + // reset rotation and velocity + weather_particles.rotation = 0 + weather_particles.velocity = generator("vector", weather_particles.base_velocity[1], weather_particles.base_velocity[2], NORMAL_RAND) + if(holder.wind_direction != 0 && holder.wind_strength != 0) // direction is set + // rain always falls down, but if the wind is east or west + // then it also gets a little bit of side momentum + // based on the horizontal component of the direction + var/wind_angle = 90 - dir2angle(holder.wind_direction) // byond's coordinate axis is fucky + var/x_wind_vel = cos(wind_angle) * holder.wind_strength + var/z_wind_vel = sin(wind_angle) * holder.wind_strength // experimental! + // tilt to an angle that makes sense for our min/max velocity + // 0 is south, but if our velocity is pure south we get -90, so add 90 + // and then invert it, because byond uses counter-clockwise and we want clockwise + weather_particles.rotation = generator("num", 90 - arctan(x_wind_vel * 0.50, weather_particles.base_velocity[1][2]), 90 - arctan(x_wind_vel, weather_particles.base_velocity[2][2]), NORMAL_RAND) + weather_particles.velocity += generator("vector", list(0, 0, 0), list(x_wind_vel, 0, z_wind_vel), NORMAL_RAND) \ No newline at end of file diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index 6c80309d3574..e44f43efa8e9 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -12,8 +12,9 @@ var/icon = 'icons/effects/weather.dmi' var/icon_state + var/particles/weather/particle_system - var/alpha = 210 + var/alpha = 170 var/minimum_time = 2 MINUTES var/maximum_time = 10 MINUTES var/is_liquid = FALSE @@ -22,6 +23,30 @@ var/list/ambient_sounds var/list/ambient_indoors_sounds +/particles/weather + width = 32 + height = 32 + bound1 = list(-16, -16, -20) + bound2 = list(20, 20, 20) + count = 100 + spawning = 2 + lifespan = 2 SECONDS // they'll hopefully hit the bounds long before this runs out + // basic 3d projection matrix + // 16px in the z axis = 1 in the y axis, because perspective memes i guess? + transform = list( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 1/16, 0, 0, + 0, 0, 0, 1, + ) + fadein = 1 + position = generator("box", list(-16, 16, -16), list(20, 20, 20)) // start at the top in the Y axis + /// How much does (east/west) wind affect the horizontal component of the particles? + var/wind_intensity = 2 + /// What is the non-wind-affected velocity component of the particles? + /// A list of two lists (minimum and maximum velocities) passed to a generator. + var/list/base_velocity = list(list(0, -6, 0), list(0, -10, 0)) + /decl/state/weather/entered_state(datum/holder) . = ..() @@ -41,6 +66,15 @@ else weather.color = COLOR_WHITE + if(ispath(particle_system)) + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + particle_source.particles = new particle_system // separate datums so that you could make some turfs have special effects in the future + weather.update_particle_system() // sync wind, etc. + else + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + if(particle_source.particles) + QDEL_NULL(particle_source.particles) + /decl/state/weather/proc/tick(var/obj/abstract/weather_system/weather) return @@ -148,7 +182,8 @@ /decl/state/weather/rain name = "Light Rain" - icon_state = "rain" + icon_state = null//"rain" + particle_system = /particles/weather/rain descriptor = "It is raining gently." cosmetic_span_class = "notice" is_liquid = TRUE @@ -162,13 +197,19 @@ protected_messages = list("Raindrops patter against $ITEM$.") var/list/roof_messages = list("Rain patters against the roof.") +/particles/weather/rain + icon = 'icons/effects/weather.dmi' + icon_state = "rain_particle" // animated particles don't seem to work... + wind_intensity = 1 + /decl/state/weather/rain/handle_roofed_effects(var/mob/living/M, var/obj/abstract/weather_system/weather) if(length(roof_messages) && prob(cosmetic_message_chance)) to_chat(M, "[pick(roof_messages)]") /decl/state/weather/rain/storm name = "Heavy Rain" - icon_state = "storm" + icon_state = null // "storm" + particle_system = /particles/weather/rain/storm descriptor = "It is raining heavily." cosmetic_span_class = "warning" transitions = list( @@ -180,6 +221,11 @@ roof_messages = list("Torrential rain thunders against the roof.") ambient_sounds = list('sound/effects/weather/rain_heavy.ogg') +/particles/weather/rain/storm + wind_intensity = 3 + spawning = 5 + count = 200 + /decl/state/weather/rain/storm/tick(var/obj/abstract/weather_system/weather) ..() if(prob(0.5)) @@ -188,6 +234,7 @@ /decl/state/weather/rain/hail name = "Hail" icon_state = "hail" + particle_system = null descriptor = "It is hailing." cosmetic_span_class = "danger" is_liquid = FALSE diff --git a/code/modules/weather/weather_init.dm b/code/modules/weather/weather_init.dm index 276b6ce614a1..48b8e16f3cd2 100644 --- a/code/modules/weather/weather_init.dm +++ b/code/modules/weather/weather_init.dm @@ -6,6 +6,10 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) set_invisibility(INVISIBILITY_NONE) + if(prob(20)) // arbitrary chance to already have some degree of wind when the weather system starts + wind_direction = pick(global.alldirs) + wind_strength = rand(1,5) + banned_weather_conditions = banned // Bookkeeping/rightclick guards. diff --git a/code/modules/weather/weather_wind.dm b/code/modules/weather/weather_wind.dm index c363f20e36e9..dc95fdd4f731 100644 --- a/code/modules/weather/weather_wind.dm +++ b/code/modules/weather/weather_wind.dm @@ -23,6 +23,11 @@ wind_direction = turn(wind_direction, 180) if(old_strength != wind_strength) mob_shown_wind.Cut() + update_particle_system() + +/obj/abstract/weather_system/proc/update_particle_system() + for(var/obj/abstract/weather_particles/particle_source in particle_sources) + particle_source.update_particle_system(src) /obj/abstract/weather_system/proc/show_wind(var/mob/M, var/force = FALSE) var/mob_ref = weakref(M) diff --git a/code/procs/hud.dm b/code/procs/hud.dm index 5f4c5580e920..49286df10006 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -13,73 +13,71 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.med_hud_users) - for(var/mob/living/human/patient in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/patient in P.hud_mob.in_view(P.hud_turf)) - if(patient.is_invisible_to(P.Mob)) + if(patient.is_invisible_to(P.hud_mob)) continue if(local_scanner) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(network) var/record = network.get_crew_record_by_name(patient.get_visible_name()) if(!record) return - P.Client.images += patient.hud_list[STATUS_HUD] + P.hud_client.images += patient.hud_list[STATUS_HUD] else var/sensor_level = getsensorlevel(patient) if(sensor_level >= VITALS_SENSOR_VITAL) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(sensor_level >= VITALS_SENSOR_BINARY) - P.Client.images += patient.hud_list[LIFE_HUD] + P.hud_client.images += patient.hud_list[LIFE_HUD] //Security HUDs. Pass a value for the second argument to enable implant viewing or other special features. /proc/process_sec_hud(var/mob/M, var/advanced_mode, var/mob/Alt, datum/computer_network/network) if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.sec_hud_users) - for(var/mob/living/human/perp in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/perp in P.hud_mob.in_view(P.hud_turf)) - if(perp.is_invisible_to(P.Mob)) + if(perp.is_invisible_to(P.hud_mob)) continue if(network) var/record = network.get_crew_record_by_name(perp.get_visible_name()) if(!record) return - P.Client.images += perp.hud_list[ID_HUD] + P.hud_client.images += perp.hud_list[ID_HUD] if(advanced_mode) - P.Client.images += perp.hud_list[WANTED_HUD] - P.Client.images += perp.hud_list[IMPTRACK_HUD] - P.Client.images += perp.hud_list[IMPLOYAL_HUD] - P.Client.images += perp.hud_list[IMPCHEM_HUD] + P.hud_client.images += perp.hud_list[WANTED_HUD] + P.hud_client.images += perp.hud_list[IMPTRACK_HUD] + P.hud_client.images += perp.hud_list[IMPLOYAL_HUD] + P.hud_client.images += perp.hud_list[IMPCHEM_HUD] /proc/process_jani_hud(var/mob/M, var/mob/Alt) var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.jani_hud_users) - for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.Mob)) - P.Client.images += dirtyfloor.hud_overlay + for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.hud_mob)) + if(istype(dirtyfloor, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = dirtyfloor + if(dirt.alpha <= 0) + continue + P.hud_client.images += dirtyfloor.hud_overlay /datum/arranged_hud_process - var/client/Client - var/mob/Mob - var/turf/Turf + var/client/hud_client + var/mob/hud_mob + var/turf/hud_turf /proc/arrange_hud_process(var/mob/M, var/mob/Alt, var/list/hud_list) hud_list |= M var/datum/arranged_hud_process/P = new - P.Client = M.client - P.Mob = Alt ? Alt : M - P.Turf = get_turf(P.Mob) + P.hud_client = M.client + P.hud_mob = Alt ? Alt : M + P.hud_turf = get_turf(P.hud_mob) return P /proc/can_process_hud(var/mob/M) - if(!M) - return 0 - if(!M.client) - return 0 - if(M.stat != CONSCIOUS) - return 0 - return 1 + return M?.client && M.stat == CONSCIOUS //Deletes the current HUD images so they can be refreshed with new ones. /mob/proc/handle_hud_glasses() //Used in the life.dm of mobs that can use HUDs. diff --git a/code/procs/AStar.dm b/code/procs/pathfinding.dm similarity index 78% rename from code/procs/AStar.dm rename to code/procs/pathfinding.dm index 01e4213f805d..7732761b8d3c 100644 --- a/code/procs/AStar.dm +++ b/code/procs/pathfinding.dm @@ -5,14 +5,14 @@ A Star pathfinding algorithm Returns a list of tiles forming a path from A to B, taking dense objects as well as walls, and the orientation of windows along the route into account. Use: -your_list = AStar(start location, end location, adjacent turf proc, distance proc) +your_list = find_path_astar(start location, end location, adjacent turf proc, distance proc) For the adjacent turf proc i wrote: /turf/proc/AdjacentTurfs And for the distance one i wrote: /turf/proc/Distance So an example use might be: -src.path_list = AStar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) +src.path_list = find_path_astar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) Note: The path is returned starting at the END node, so i wrote reverselist to reverse it for ease of use. @@ -60,7 +60,12 @@ length to avoid portals or something i guess?? Not that they're counted right no /proc/PathWeightCompare(PathNode/a, PathNode/b) return a.estimated_cost - b.estimated_cost -/proc/AStar(var/start, var/end, adjacent, dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) +/proc/find_path_astar_async(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude) + set waitfor = FALSE + return find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick = TRUE) + +/proc/find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + var/datum/priority_queue/open = new /datum/priority_queue(/proc/PathWeightCompare) var/list/closed = list() var/list/path @@ -85,13 +90,11 @@ length to avoid portals or something i guess?? Not that they're counted right no path[index--] = current.position break - if(min_node_dist && max_node_depth) - if(call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth) - continue + if(min_node_dist && max_node_depth && (call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth)) + continue - if(max_node_depth) - if(current.nodes_traversed >= max_node_depth) - continue + if(max_node_depth && current.nodes_traversed >= max_node_depth) + continue for(var/datum/datum in call(current.position, adjacent)(id)) if(datum == exclude) @@ -115,4 +118,9 @@ length to avoid portals or something i guess?? Not that they're counted right no if(max_nodes && open.Length() > max_nodes) open.Remove(open.Length()) + if(check_tick) + CHECK_TICK + if(check_tick) + CHECK_TICK + return path diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index e0b6a7e17ae1..5cf5cb9dce72 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -127,15 +127,22 @@ ) /turf/wall/proc/get_turf_validation_corner_states() - . = list("", "other") - if(paint_color) + . = list("") + if(!material) + CRASH("[type] lacks a material!") + if(material?.wall_flags & WALL_HAS_EDGES) + . |= "other" + if(paint_color || (material?.wall_flags & PAINT_PAINTABLE)) . |= "paint" - if(stripe_color) + if(stripe_color || (material?.wall_flags & PAINT_STRIPABLE)) . |= "stripe" /turf/wall/natural/get_turf_validation_corner_states() return list("", "shine") +/turf/wall/log/get_turf_validation_corner_states() + return list("", "other") + /turf/wall/validate_turf() // Walls generate their own icons, icon/icon_state are largely irrelevant other than map previews. diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 2d23719ea302..cef4aba20aab 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -9,7 +9,7 @@ var/list/possible_cable_colours = get_global_cable_colors() for(var/color_name in possible_cable_colours) group_by(names, color_name, index) - group_by(colors, possible_cable_colours[color_name], index) + group_by(colors, possible_cable_colours[color_name], color_name) index++ var/number_of_issues = number_of_issues(names, "Names") @@ -207,26 +207,6 @@ pass("All gas symbols are unique.") return TRUE -/datum/unit_test/submaps_shall_have_a_unique_descriptor - name = "UNIQUENESS: Archetypes shall have a valid, unique descriptor." - -/datum/unit_test/submaps_shall_have_a_unique_descriptor/start_test() - var/list/submaps_by_name = list() - - var/list/all_submaps = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/submap_type in all_submaps) - var/decl/submap_archetype/submap = all_submaps[submap_type] - if(submap.descriptor) - group_by(submaps_by_name, submap.descriptor, submap_type) - - var/number_of_issues = number_of_issues(submaps_by_name, "Submap Archetype Descriptors") - if(length(number_of_issues)) - fail("Found [number_of_issues] submap archetype\s with duplicate descriptors.") - else - pass("All submap archetypes have unique descriptors.") - return 1 - - /datum/unit_test/proc/number_of_issues(var/list/entries, var/type, var/feedback = /decl/noi_feedback) var/issues = 0 for(var/key in entries) diff --git a/config/example/configuration.txt b/config/example/configuration.txt index 13bfd6b1c6db..2c603dbfd791 100644 --- a/config/example/configuration.txt +++ b/config/example/configuration.txt @@ -345,22 +345,19 @@ ROUNDSTART_LEVEL_GENERATION ## If uncommented, votes can be called to add extra antags to the round. Uncomment to enable. #ALLOW_EXTRA_ANTAGS -## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Remove the # to make rounds which end instantly continue until the shuttle is called or the station is nuked. ## Malf and Rev will let the shuttle be called when the antags/protags are dead. ## Uncomment to enable. #CONTINUOUS_ROUNDS -## Spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard. Uncomment to enable. -#FEATURE_OBJECT_SPELL_SYSTEM - ## Allowed modes. -#MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor","wizard"] +#MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor"] ## Mode names. -#MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","wizard":"Wizard","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} +#MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} ## Relative probability of each mode. -#PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"wizard":1,"cult":1,"heist":0,"ninja":0,"revolution":0,"traitor":0,"spyvspy":0,"crossfire":0} +#PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"cult":1,"heist":0,"ninja":0,"revolution":0,"traitor":0,"spyvspy":0,"crossfire":0} ## If security is prohibited from being most antagonists. Uncomment to enable. #PROTECT_ROLES_FROM_ANTAGONIST @@ -369,7 +366,7 @@ ROUNDSTART_LEVEL_GENERATION #TRAITOR_SCALING ## A list of modes that should be votable. -#VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor","wizard"] +#VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor"] ## # PROTECTED @@ -377,13 +374,13 @@ ROUNDSTART_LEVEL_GENERATION ## ## Password used for authorizing external tools that can apply bans. -#BAN_COMMS_PASSWORD +#BAN_COMMS_PASSWORD ## Password used for authorizing ircbot and other external tools. -#COMMS_PASSWORD +#COMMS_PASSWORD ## Export address where external tools that monitor logins are located. -#LOGIN_EXPORT_ADDR +#LOGIN_EXPORT_ADDR ## # RESOURCES @@ -413,7 +410,7 @@ ROUNDSTART_LEVEL_GENERATION #ABANDON_ALLOWED 1 ## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_IRC +#ADMIN_IRC ## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. #ADMIN_LEGACY_SYSTEM 1 @@ -431,7 +428,7 @@ ROUNDSTART_LEVEL_GENERATION #AOOC_ALLOWED 1 ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -#BANAPPEALS +#BANAPPEALS ## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. #BAN_LEGACY_SYSTEM 1 @@ -452,7 +449,7 @@ ROUNDSTART_LEVEL_GENERATION #DISABLE_WEBHOOK_EMBEDS ## Discord server permanent invite address. -#DISCORDURL +#DISCORDURL ## Comment to disable the dead OOC channel by default. #DOOC_ALLOWED 1 @@ -473,20 +470,20 @@ ROUNDSTART_LEVEL_GENERATION #FORBID_SINGULO_POSSESSION ## Discussion forum address. -#FORUMURL +#FORUMURL ## Defines world FPS. Defaults to 20. ## Can also accept ticklag values (0.9, 0.5, etc) which will automatically be converted to FPS. #FPS 20 ## GitHub address. -#GITHUBURL +#GITHUBURL ## Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server. Uncomment to enable. #GUESTS_ALLOWED ## Set a hosted by name for UNIX platforms. -#HOSTEDBY +#HOSTEDBY ## Hub visibility: If you want to be visible on the hub, uncomment the below line and be sure that Dream Daemon is set to visible. This can be changed in-round as well with toggle-hub-visibility if Dream Daemon is set correctly. Uncomment to enable. #HUB_VISIBILITY @@ -495,7 +492,7 @@ ROUNDSTART_LEVEL_GENERATION #IRC_BOT_HOST localhost ## GitHub new issue address. -#ISSUEREPORTURL +#ISSUEREPORTURL ## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. #JOBS_HAVE_MINIMAL_ACCESS 1 @@ -554,11 +551,11 @@ ROUNDSTART_LEVEL_GENERATION #RESPAWN_DELAY 30 ## Set a server location for world reboot. Don't include the byond://, just give the address and port. -#SERVER +#SERVER ## Set a server URL for the IRC bot to use; like SERVER, don't include the byond:// ## Unlike SERVER, this one shouldn't break auto-reconnect. -#SERVERURL +#SERVERURL ## Server name: This appears at the top of the screen in-game. #SERVER_NAME Nebula 13 @@ -591,7 +588,7 @@ USEALIENWHITELIST #WAIT_FOR_SIGUSR1_REBOOT ## Wiki address. -#WIKIURL +#WIKIURL ## # VOTING diff --git a/html/changelog.html b/html/changelog.html index 526d388b528b..d152fc178400 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,18 @@ -->
+

21 December 2024

+

Penelope Haze updated:

+ + +

07 December 2024

+

MistakeNot4892 updated:

+ +

05 December 2024

ophelia updated:

- -

08 October 2024

-

Sutures updated:

- - -

05 October 2024

-

MistakeNot4892 updated:

-
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 6bcd5bb49501..09a36ad22649 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14929,3 +14929,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: You can now put any disk into the research design database or research design console, but only the correct disk type (tech disk or design disk) will function. +2024-12-07: + MistakeNot4892: + - tweak: Most wooden floors and tables on space maps are now chipboard laminate + instead. +2024-12-21: + Penelope Haze: + - tweak: Makes weather effects slightly more transparent. diff --git a/html/changelogs/AutoChangeLog-pr-4583.yml b/html/changelogs/AutoChangeLog-pr-4583.yml deleted file mode 100644 index 9c592814efdd..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4583.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: Most wooden floors and tables on space maps are now chipboard laminate - instead.} -delete-after: true diff --git a/icons/clothing/accessories/jewelry/locket.dmi b/icons/clothing/accessories/jewelry/locket.dmi deleted file mode 100644 index eeee8efe7eaa..000000000000 Binary files a/icons/clothing/accessories/jewelry/locket.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/necklace.dmi b/icons/clothing/accessories/jewelry/necklace.dmi index 23c9eee00631..2f5ca2d3cfb1 100644 Binary files a/icons/clothing/accessories/jewelry/necklace.dmi and b/icons/clothing/accessories/jewelry/necklace.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/cross.dmi b/icons/clothing/accessories/jewelry/pendants/cross.dmi new file mode 100644 index 000000000000..ca9d50a60f0b Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/cross.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/crystal.dmi b/icons/clothing/accessories/jewelry/pendants/crystal.dmi new file mode 100644 index 000000000000..a54525da6ab1 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/crystal.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/diamond.dmi b/icons/clothing/accessories/jewelry/pendants/diamond.dmi new file mode 100644 index 000000000000..44e931a658d4 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/diamond.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/frill.dmi b/icons/clothing/accessories/jewelry/pendants/frill.dmi new file mode 100644 index 000000000000..97891de4bc3b Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/frill.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/locket.dmi b/icons/clothing/accessories/jewelry/pendants/locket.dmi new file mode 100644 index 000000000000..e8f1bbee40b2 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/locket.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/ornate.dmi b/icons/clothing/accessories/jewelry/pendants/ornate.dmi new file mode 100644 index 000000000000..9e6901f4e298 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/ornate.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/square.dmi b/icons/clothing/accessories/jewelry/pendants/square.dmi new file mode 100644 index 000000000000..5c9040c7baa8 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/square.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring.dmi b/icons/clothing/accessories/jewelry/rings/ring.dmi deleted file mode 100644 index 5a116c6c8209..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band.dmi b/icons/clothing/accessories/jewelry/rings/ring_band.dmi new file mode 100644 index 000000000000..b8f40338dccc Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi new file mode 100644 index 000000000000..fb29ccae72af Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi new file mode 100644 index 000000000000..93a83527a244 Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi new file mode 100644 index 000000000000..83c9b2ced56f Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_blue.dmi b/icons/clothing/accessories/jewelry/rings/ring_blue.dmi deleted file mode 100644 index e607595960ff..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_blue.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_cti.dmi b/icons/clothing/accessories/jewelry/rings/ring_cti.dmi deleted file mode 100644 index 6acd9239cbd6..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_cti.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi b/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi deleted file mode 100644 index e05fcffea0fb..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_magic.dmi b/icons/clothing/accessories/jewelry/rings/ring_magic.dmi deleted file mode 100644 index 885a1d75314e..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_magic.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi b/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi deleted file mode 100644 index 32a6a93b5e9b..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal.dmi new file mode 100644 index 000000000000..620206a28cb7 Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_seal.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi index 12fc05d63a0c..c2efcfd5c186 100644 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi and b/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi deleted file mode 100644 index bddad5ae7584..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi index 63eaa34ef641..e6145d53c509 100644 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi and b/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi b/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi deleted file mode 100644 index 43542dbc9821..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_star.dmi b/icons/clothing/accessories/jewelry/rings/ring_star.dmi deleted file mode 100644 index 4308da7ff6fe..000000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_star.dmi and /dev/null differ diff --git a/icons/clothing/suits/sleeved_robe.dmi b/icons/clothing/suits/sleeved_robe.dmi new file mode 100644 index 000000000000..6895f94a926a Binary files /dev/null and b/icons/clothing/suits/sleeved_robe.dmi differ diff --git a/icons/effects/hay.dmi b/icons/effects/hay.dmi new file mode 100644 index 000000000000..47c16d24770d Binary files /dev/null and b/icons/effects/hay.dmi differ diff --git a/icons/effects/weather.dmi b/icons/effects/weather.dmi index 01aa9d456f42..aa4438a638dc 100644 Binary files a/icons/effects/weather.dmi and b/icons/effects/weather.dmi differ diff --git a/icons/obj/closets/bases/cabinet.dmi b/icons/obj/closets/bases/cabinet.dmi index 236b164ca6ef..603874dd3c18 100644 Binary files a/icons/obj/closets/bases/cabinet.dmi and b/icons/obj/closets/bases/cabinet.dmi differ diff --git a/icons/obj/food/cooking_vessels/cauldron.dmi b/icons/obj/food/cooking_vessels/cauldron.dmi new file mode 100644 index 000000000000..7be32a10bde4 Binary files /dev/null and b/icons/obj/food/cooking_vessels/cauldron.dmi differ diff --git a/icons/obj/food/hay.dmi b/icons/obj/food/hay.dmi new file mode 100644 index 000000000000..2a24bc36b017 Binary files /dev/null and b/icons/obj/food/hay.dmi differ diff --git a/icons/obj/items/candelabra.dmi b/icons/obj/items/candelabra.dmi new file mode 100644 index 000000000000..3d0b00109452 Binary files /dev/null and b/icons/obj/items/candelabra.dmi differ diff --git a/icons/obj/items/flame/candle.dmi b/icons/obj/items/flame/candle.dmi index fa33e15df8ba..ef2c6a8987f0 100644 Binary files a/icons/obj/items/flame/candle.dmi and b/icons/obj/items/flame/candle.dmi differ diff --git a/icons/obj/items/gemstones/baguette.dmi b/icons/obj/items/gemstones/baguette.dmi new file mode 100644 index 000000000000..a10c3dc67545 Binary files /dev/null and b/icons/obj/items/gemstones/baguette.dmi differ diff --git a/icons/obj/items/gemstones/hexagon.dmi b/icons/obj/items/gemstones/hexagon.dmi new file mode 100644 index 000000000000..a66d147db142 Binary files /dev/null and b/icons/obj/items/gemstones/hexagon.dmi differ diff --git a/icons/obj/items/gemstones/octagon.dmi b/icons/obj/items/gemstones/octagon.dmi new file mode 100644 index 000000000000..c216faaadf9f Binary files /dev/null and b/icons/obj/items/gemstones/octagon.dmi differ diff --git a/icons/obj/items/gemstones/poor.dmi b/icons/obj/items/gemstones/poor.dmi new file mode 100644 index 000000000000..97d192b3493e Binary files /dev/null and b/icons/obj/items/gemstones/poor.dmi differ diff --git a/icons/obj/items/gemstones/round.dmi b/icons/obj/items/gemstones/round.dmi new file mode 100644 index 000000000000..69bca88b994b Binary files /dev/null and b/icons/obj/items/gemstones/round.dmi differ diff --git a/icons/obj/items/gemstones/uncut.dmi b/icons/obj/items/gemstones/uncut.dmi new file mode 100644 index 000000000000..46b30ab23434 Binary files /dev/null and b/icons/obj/items/gemstones/uncut.dmi differ diff --git a/icons/obj/pottery/bottle.dmi b/icons/obj/items/handmade/bottle.dmi similarity index 100% rename from icons/obj/pottery/bottle.dmi rename to icons/obj/items/handmade/bottle.dmi diff --git a/icons/obj/pottery/bottle_tall.dmi b/icons/obj/items/handmade/bottle_tall.dmi similarity index 100% rename from icons/obj/pottery/bottle_tall.dmi rename to icons/obj/items/handmade/bottle_tall.dmi diff --git a/icons/obj/pottery/bottle_wide.dmi b/icons/obj/items/handmade/bottle_wide.dmi similarity index 100% rename from icons/obj/pottery/bottle_wide.dmi rename to icons/obj/items/handmade/bottle_wide.dmi diff --git a/icons/obj/pottery/bowl.dmi b/icons/obj/items/handmade/bowl.dmi similarity index 100% rename from icons/obj/pottery/bowl.dmi rename to icons/obj/items/handmade/bowl.dmi diff --git a/icons/obj/items/handmade/bowl_fancy.dmi b/icons/obj/items/handmade/bowl_fancy.dmi new file mode 100644 index 000000000000..af43c58133af Binary files /dev/null and b/icons/obj/items/handmade/bowl_fancy.dmi differ diff --git a/icons/obj/pottery/cup.dmi b/icons/obj/items/handmade/cup.dmi similarity index 100% rename from icons/obj/pottery/cup.dmi rename to icons/obj/items/handmade/cup.dmi diff --git a/icons/obj/items/handmade/cup_fancy.dmi b/icons/obj/items/handmade/cup_fancy.dmi new file mode 100644 index 000000000000..02f64ffe84fa Binary files /dev/null and b/icons/obj/items/handmade/cup_fancy.dmi differ diff --git a/icons/obj/items/handmade/decanter.dmi b/icons/obj/items/handmade/decanter.dmi new file mode 100644 index 000000000000..aad1cd74fe34 Binary files /dev/null and b/icons/obj/items/handmade/decanter.dmi differ diff --git a/icons/obj/pottery/jar.dmi b/icons/obj/items/handmade/jar.dmi similarity index 100% rename from icons/obj/pottery/jar.dmi rename to icons/obj/items/handmade/jar.dmi diff --git a/icons/obj/pottery/mug.dmi b/icons/obj/items/handmade/mug.dmi similarity index 100% rename from icons/obj/pottery/mug.dmi rename to icons/obj/items/handmade/mug.dmi diff --git a/icons/obj/pottery/teapot.dmi b/icons/obj/items/handmade/teapot.dmi similarity index 100% rename from icons/obj/pottery/teapot.dmi rename to icons/obj/items/handmade/teapot.dmi diff --git a/icons/obj/pottery/vase.dmi b/icons/obj/items/handmade/vase.dmi similarity index 100% rename from icons/obj/pottery/vase.dmi rename to icons/obj/items/handmade/vase.dmi diff --git a/icons/obj/items/handmade/vase_fancy.dmi b/icons/obj/items/handmade/vase_fancy.dmi new file mode 100644 index 000000000000..8a66723be837 Binary files /dev/null and b/icons/obj/items/handmade/vase_fancy.dmi differ diff --git a/icons/obj/items/handmade/vase_fancy_fluted.dmi b/icons/obj/items/handmade/vase_fancy_fluted.dmi new file mode 100644 index 000000000000..af3a2270a766 Binary files /dev/null and b/icons/obj/items/handmade/vase_fancy_fluted.dmi differ diff --git a/icons/obj/items/storage/backpack/backpack_crafted.dmi b/icons/obj/items/storage/backpack/backpack_crafted.dmi new file mode 100644 index 000000000000..e565e4862a1b Binary files /dev/null and b/icons/obj/items/storage/backpack/backpack_crafted.dmi differ diff --git a/icons/obj/items/storage/backpack/backpack_haversack.dmi b/icons/obj/items/storage/backpack/backpack_haversack.dmi new file mode 100644 index 000000000000..ca148f6a4eac Binary files /dev/null and b/icons/obj/items/storage/backpack/backpack_haversack.dmi differ diff --git a/icons/obj/items/storage/basket.dmi b/icons/obj/items/storage/basket.dmi deleted file mode 100644 index 8f6981dc10d0..000000000000 Binary files a/icons/obj/items/storage/basket.dmi and /dev/null differ diff --git a/icons/obj/items/storage/baskets/basket_large.dmi b/icons/obj/items/storage/baskets/basket_large.dmi new file mode 100644 index 000000000000..71c23d7b6ce1 Binary files /dev/null and b/icons/obj/items/storage/baskets/basket_large.dmi differ diff --git a/icons/obj/items/storage/baskets/basket_round.dmi b/icons/obj/items/storage/baskets/basket_round.dmi new file mode 100644 index 000000000000..c84fe4b7e607 Binary files /dev/null and b/icons/obj/items/storage/baskets/basket_round.dmi differ diff --git a/icons/obj/items/training_dummies/alien.dmi b/icons/obj/items/training_dummies/alien.dmi new file mode 100644 index 000000000000..a08ae3ce7fa2 Binary files /dev/null and b/icons/obj/items/training_dummies/alien.dmi differ diff --git a/icons/obj/items/training_dummies/archery.dmi b/icons/obj/items/training_dummies/archery.dmi new file mode 100644 index 000000000000..b3e58a34a26c Binary files /dev/null and b/icons/obj/items/training_dummies/archery.dmi differ diff --git a/icons/obj/items/training_dummies/damage.dmi b/icons/obj/items/training_dummies/damage.dmi new file mode 100644 index 000000000000..6eaae4a674ab Binary files /dev/null and b/icons/obj/items/training_dummies/damage.dmi differ diff --git a/icons/obj/items/training_dummies/standard.dmi b/icons/obj/items/training_dummies/standard.dmi new file mode 100644 index 000000000000..d4b367b4db84 Binary files /dev/null and b/icons/obj/items/training_dummies/standard.dmi differ diff --git a/icons/obj/items/training_dummies/straw.dmi b/icons/obj/items/training_dummies/straw.dmi new file mode 100644 index 000000000000..aa4646488b34 Binary files /dev/null and b/icons/obj/items/training_dummies/straw.dmi differ diff --git a/icons/obj/items/training_dummies/syndicate.dmi b/icons/obj/items/training_dummies/syndicate.dmi new file mode 100644 index 000000000000..aee57436e791 Binary files /dev/null and b/icons/obj/items/training_dummies/syndicate.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 4705a37d998f..ec7ad98c685e 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/structures/armor_stand.dmi b/icons/obj/structures/armor_stand.dmi new file mode 100644 index 000000000000..0431f7f626cc Binary files /dev/null and b/icons/obj/structures/armor_stand.dmi differ diff --git a/icons/obj/structures/divider.dmi b/icons/obj/structures/divider.dmi new file mode 100644 index 000000000000..5016482a2a1a Binary files /dev/null and b/icons/obj/structures/divider.dmi differ diff --git a/icons/obj/structures/grandfather_clock.dmi b/icons/obj/structures/grandfather_clock.dmi new file mode 100644 index 000000000000..cbef65c5ac44 Binary files /dev/null and b/icons/obj/structures/grandfather_clock.dmi differ diff --git a/icons/obj/structures/haybale.dmi b/icons/obj/structures/haybale.dmi new file mode 100644 index 000000000000..822e36790b39 Binary files /dev/null and b/icons/obj/structures/haybale.dmi differ diff --git a/icons/obj/structures/haystack.dmi b/icons/obj/structures/haystack.dmi new file mode 100644 index 000000000000..fb663b7285f8 Binary files /dev/null and b/icons/obj/structures/haystack.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_inset.dmi b/icons/obj/structures/pillars/pillar_wide_inset.dmi new file mode 100644 index 000000000000..8f307cd2eb0b Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_inset.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_round.dmi b/icons/obj/structures/pillars/pillar_wide_round.dmi new file mode 100644 index 000000000000..c0625980dd87 Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_round.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_square.dmi b/icons/obj/structures/pillars/pillar_wide_square.dmi new file mode 100644 index 000000000000..a5ea0d80445b Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_square.dmi differ diff --git a/icons/obj/structures/rug.dmi b/icons/obj/structures/rug.dmi new file mode 100644 index 000000000000..ab64dd8fba6a Binary files /dev/null and b/icons/obj/structures/rug.dmi differ diff --git a/icons/obj/structures/target_stakes/archery_butt.dmi b/icons/obj/structures/target_stakes/archery_butt.dmi new file mode 100644 index 000000000000..b2e7253cf4bd Binary files /dev/null and b/icons/obj/structures/target_stakes/archery_butt.dmi differ diff --git a/icons/obj/structures/target_stakes/target_stake.dmi b/icons/obj/structures/target_stakes/target_stake.dmi new file mode 100644 index 000000000000..7423233493f0 Binary files /dev/null and b/icons/obj/structures/target_stakes/target_stake.dmi differ diff --git a/icons/turf/flooring/straw.dmi b/icons/turf/flooring/straw.dmi new file mode 100644 index 000000000000..f797358bf238 Binary files /dev/null and b/icons/turf/flooring/straw.dmi differ diff --git a/icons/turf/walls/_previews.dmi b/icons/turf/walls/_previews.dmi index 02e2637c0c77..59e03e52b4d6 100644 Binary files a/icons/turf/walls/_previews.dmi and b/icons/turf/walls/_previews.dmi differ diff --git a/icons/turf/walls/plaster.dmi b/icons/turf/walls/plaster.dmi new file mode 100644 index 000000000000..ee8b3faf2b4b Binary files /dev/null and b/icons/turf/walls/plaster.dmi differ diff --git a/icons/turf/walls/reinforced_timber.dmi b/icons/turf/walls/reinforced_timber.dmi new file mode 100644 index 000000000000..46e537f04e08 Binary files /dev/null and b/icons/turf/walls/reinforced_timber.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_1.dmi b/icons/turf/walls/reinforced_timber_alt_1.dmi new file mode 100644 index 000000000000..f6eb3a41df36 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_1.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_2.dmi b/icons/turf/walls/reinforced_timber_alt_2.dmi new file mode 100644 index 000000000000..c06be35cb5fe Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_2.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_3.dmi b/icons/turf/walls/reinforced_timber_alt_3.dmi new file mode 100644 index 000000000000..1ee1a9f46257 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_3.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_4.dmi b/icons/turf/walls/reinforced_timber_alt_4.dmi new file mode 100644 index 000000000000..ac01d0457a58 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_4.dmi differ diff --git a/icons/turf/walls/square_shutter.dmi b/icons/turf/walls/square_shutter.dmi new file mode 100644 index 000000000000..d0729a887beb Binary files /dev/null and b/icons/turf/walls/square_shutter.dmi differ diff --git a/icons/turf/walls/wattle.dmi b/icons/turf/walls/wattle.dmi new file mode 100644 index 000000000000..01ee0aadc3e9 Binary files /dev/null and b/icons/turf/walls/wattle.dmi differ diff --git a/icons/turf/walls/wattledaub.dmi b/icons/turf/walls/wattledaub.dmi new file mode 100644 index 000000000000..126f7829c7e9 Binary files /dev/null and b/icons/turf/walls/wattledaub.dmi differ diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 86f6f092e57a..f75023f8eb7d 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -1209,7 +1209,7 @@ /obj/item/stack/material/sheet/reinforced/mapped/plasteel/ten, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/rglass/fifty, /obj/item/stack/material/pane/mapped/rborosilicate/ten, /obj/structure/cable{ @@ -2751,9 +2751,9 @@ /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, diff --git a/maps/antag_spawn/wizard/wizard.dm b/maps/antag_spawn/wizard/wizard.dm deleted file mode 100644 index 4ca75cd145d4..000000000000 --- a/maps/antag_spawn/wizard/wizard.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/map_template/ruin/antag_spawn/wizard - name = "Wizard Base" - suffixes = list("wizard/wizard_base.dmm") - apc_test_exempt_areas = list( - /area/map_template/wizard_station = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/wizard_station - name = "\improper Wizard's Den" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE - req_access = list(access_wizard) diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm deleted file mode 100644 index abc19fb4422c..000000000000 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ /dev/null @@ -1,1747 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space/infinity, -/area/space) -"ab" = ( -/turf/unsimulated/wall, -/area/map_template/wizard_station) -"ac" = ( -/obj/structure/table/wood, -/obj/item/backpack/cultpack, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ad" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 8 - }, -/area/map_template/wizard_station) -"ae" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 4 - }, -/area/map_template/wizard_station) -"af" = ( -/obj/structure/table/wood, -/obj/item/backpack/satchel/grey/withwallet, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ag" = ( -/turf/floor/carpet, -/area/map_template/wizard_station) -"ah" = ( -/obj/structure/undies_wardrobe, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ai" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 8 - }, -/area/map_template/wizard_station) -"aj" = ( -/obj/structure/door/wood, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ak" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/chems/drinks/flask/barflask, -/turf/floor/carpet, -/area/map_template/wizard_station) -"al" = ( -/obj/structure/table/wood, -/obj/item/dice, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"am" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/rd, -/turf/floor/carpet, -/area/map_template/wizard_station) -"an" = ( -/obj/structure/table/wood, -/obj/item/dice/d20, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ao" = ( -/obj/structure/table/wood, -/obj/item/backpack/satchel/grey/withwallet, -/obj/item/clothing/glasses/eyepatch/monocle, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ap" = ( -/mob/living/human/monkey{ - name = "Murphey" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aq" = ( -/obj/structure/table/wood, -/obj/item/food/chawanmushi, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ar" = ( -/obj/structure/table/wood, -/obj/abstract/landmark{ - name = "Teleport-Scroll" - }, -/obj/item/toy/figure/ninja, -/turf/floor/carpet, -/area/map_template/wizard_station) -"as" = ( -/obj/structure/table/wood, -/obj/item/megaphone, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"at" = ( -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"au" = ( -/obj/structure/table/wood, -/obj/item/cash/c1, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"av" = ( -/obj/structure/table/wood, -/obj/machinery/chemical_dispenser/bar_soft/full, -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aw" = ( -/obj/machinery/vending/magivend, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ax" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 8 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"ay" = ( -/obj/abstract/landmark/start{ - name = "wizard" - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"az" = ( -/obj/structure/aliumizer, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aA" = ( -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aB" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aC" = ( -/obj/structure/bookcase{ - name = "bookcase (Tactics)" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aD" = ( -/obj/structure/bookcase, -/obj/item/book/manual/nuclear, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aE" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aF" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 1 - }, -/area/map_template/wizard_station) -"aG" = ( -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aH" = ( -/obj/structure/bookcase, -/obj/item/book/manual/robotics_cyborgs, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aI" = ( -/obj/item/bikehorn/rubberducky, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aJ" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/machinery/acting/changer/mirror{ - pixel_y = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aK" = ( -/obj/structure/hygiene/toilet{ - pixel_y = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aL" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/wizard{ - dir = 4; - pixel_x = -22 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aM" = ( -/obj/structure/closet/coffin, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"aN" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 4 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aO" = ( -/obj/structure/table/wood, -/obj/item/box/cups, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aP" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/red, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/head/wizard/red, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aQ" = ( -/obj/structure/table/wood, -/obj/item/bag/cash, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aR" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/marisa, -/obj/item/clothing/shoes/sandal/marisa, -/obj/item/clothing/head/wizard/marisa, -/obj/item/staff/broom, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aS" = ( -/obj/structure/table/wood, -/obj/item/box/candles, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aT" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusblue, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aU" = ( -/obj/structure/closet, -/obj/item/chems/drinks/bottle/pwine, -/obj/item/chems/drinks/bottle/agedwhiskey, -/obj/item/chems/drinks/bottle/cognac, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aV" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aW" = ( -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aX" = ( -/obj/structure/door/iron, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aY" = ( -/obj/structure/table/wood, -/obj/item/box/fancy/donut, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"aZ" = ( -/obj/structure/door/wood, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"ba" = ( -/obj/structure/door/silver, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bb" = ( -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bc" = ( -/turf/unsimulated/wall/fakeglass, -/area/map_template/wizard_station) -"bd" = ( -/obj/item/soap, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"be" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bf" = ( -/obj/structure/hygiene/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bg" = ( -/obj/structure/table/wood, -/obj/item/chems/glass/bowl/mapped/meatball, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bh" = ( -/obj/structure/closet, -/obj/item/clothing/jumpsuit/psysuit, -/obj/item/clothing/suit/wizrobe/psypurple, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bi" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 1 - }, -/area/map_template/wizard_station) -"bj" = ( -/obj/structure/closet, -/obj/item/clothing/shoes/sandal/marisa{ - desc = "A set of fancy shoes that are as functional as they are comfortable."; - name = "Gentlemans Shoes" - }, -/obj/item/clothing/shirt/button/black, -/obj/item/clothing/suit/jacket/vest/gray, -/obj/item/clothing/suit/wizrobe/gentlecoat, -/obj/item/clothing/head/wizard/cap, -/obj/item/cane/fancy, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bk" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusred, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bl" = ( -/obj/structure/closet, -/obj/item/briefcase, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bm" = ( -/obj/structure/bookcase, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bn" = ( -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/laminate, -/area/map_template/wizard_station) -"bo" = ( -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bp" = ( -/obj/item/radio/intercom/wizard{ - pixel_y = 20 - }, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bq" = ( -/obj/structure/fake_pylon, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"br" = ( -/obj/structure/meat_hook, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bs" = ( -/obj/item/remains/human, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bt" = ( -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bu" = ( -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bv" = ( -/obj/structure/flora/bush/fullgrass, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bw" = ( -/mob/living/simple_animal/hostile/creature{ - name = "Experiment 35b" - }, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bx" = ( -/obj/structure/talisman_altar, -/obj/item/knife/ritual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"by" = ( -/obj/structure/table/wood, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bz" = ( -/obj/effect/gateway/active/spooky, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bA" = ( -/obj/structure/table/marble, -/obj/item/flashlight/slime, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bB" = ( -/mob/living/simple_animal/hostile/goat{ - name = "Experiment 97d" - }, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bC" = ( -/obj/structure/flora/bush/grassybush, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bD" = ( -/obj/structure/flora/pottedplant/unusual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bE" = ( -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bF" = ( -/obj/effect/overlay/palmtree_r, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bG" = ( -/mob/living/simple_animal/crab{ - name = "Experiment 68a" - }, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bH" = ( -/obj/effect/overlay/coconut, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aG -aG -bd -ab -aa -aa -aa -aa -aa -aa -aa -ab -bs -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aI -aG -aG -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aJ -aV -be -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bw -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aK -aW -bf -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bs -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aX -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aE -aL -at -aw -aD -ab -ab -aa -aa -aa -ab -ab -bq -bo -bx -bo -bq -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aB -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -ai -ak -ar -ac -af -ab -al -at -aN -as -aN -at -aQ -ab -at -at -bn -ab -bo -bo -ai -ab -ai -bo -bo -ai -bE -bE -bE -bH -ab -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -ad -am -ay -ag -ag -aj -at -at -aq -aY -bg -at -at -ba -at -at -at -ba -bo -bo -ad -bz -ad -bo -by -ad -bE -bE -bG -bE -ab -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -ae -ao -az -aA -ah -ab -an -ap -ax -au -ax -at -aS -ab -at -at -at -ab -bp -bo -ae -ab -ae -bo -bo -ae -bE -bF -bE -bE -ab -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aC -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aC -aO -at -av -aH -ab -ab -aa -aa -aa -ab -ab -br -bo -bA -bo -br -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aZ -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aP -bb -bh -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bC -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aR -bb -bj -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aT -bb -bk -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bB -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aU -bb -bl -ab -aa -aa -aa -aa -aa -aa -aa -ab -bv -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 947b876eee6d..f5de21280396 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -145,7 +145,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aw" = ( @@ -253,11 +253,11 @@ pixel_x = -24; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -335,7 +335,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -724,7 +724,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/lower) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -830,7 +830,7 @@ /area/ship/scrap/cargo/lower) "bQ" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/shuttle_control/lift, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -1111,7 +1111,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ct" = ( @@ -1283,7 +1283,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "cQ" = ( @@ -1540,16 +1540,16 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dq" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dr" = ( @@ -1561,7 +1561,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ds" = ( @@ -1957,7 +1957,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1973,7 +1973,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "ej" = ( @@ -1983,7 +1983,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1; icon_state = "bulb1" @@ -2060,7 +2060,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2073,7 +2073,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2090,7 +2090,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2130,7 +2130,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "ey" = ( @@ -2306,7 +2306,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2319,7 +2319,7 @@ /obj/structure/cable{ icon_state = "5-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "eM" = ( @@ -2330,14 +2330,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "eN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "eO" = ( @@ -2384,7 +2384,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 9fd790d88df5..b6ad7af5d298 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -587,7 +587,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -654,7 +654,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -773,7 +773,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -912,7 +912,7 @@ /turf/floor/usedup, /area/ship/scrap/dock) "bM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -1234,7 +1234,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1554,7 +1554,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1571,7 +1571,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -1592,7 +1592,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1608,7 +1608,7 @@ /turf/wall, /area/ship/scrap/crew/saloon) "dn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -1668,7 +1668,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/tiled/usedup, @@ -1824,13 +1824,13 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/portable_atmospherics/canister/air, /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/corner/beige{ dir = 6 @@ -1940,7 +1940,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/hallway/port) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -1954,7 +1954,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1973,7 +1973,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4; icon_state = "bulb1" @@ -2055,7 +2055,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/kitchen) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2173,7 +2173,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2386,7 +2386,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; @@ -2418,7 +2418,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -2568,7 +2568,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/computer/shuttle_control/lift, @@ -2585,7 +2585,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fd" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -2972,7 +2972,7 @@ /area/ship/scrap/cargo) "fO" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3090,7 +3090,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3348,7 +3348,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/fire) "gD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -3486,7 +3486,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/hallway) "gO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3756,8 +3756,8 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "ho" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3792,7 +3792,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3962,7 +3962,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3981,7 +3981,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -4058,7 +4058,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "hM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/atmos) @@ -4140,7 +4140,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -4542,13 +4542,13 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "iO" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /mob/living/simple_animal/hostile/carp, /turf/space, /area/ship/scrap/maintenance/atmos) "iP" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/atmos) "iQ" = ( @@ -4686,7 +4686,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "jc" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/power) @@ -4861,7 +4861,7 @@ /turf/wall, /area/ship/scrap/maintenance/power) "jB" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "jC" = ( @@ -4939,7 +4939,7 @@ /area/ship/scrap/maintenance/engine/aft) "jN" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/engine/aft) @@ -5003,7 +5003,7 @@ /turf/floor/plating/airless, /area/ship/scrap/maintenance/engine/aft) "jX" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/engine/aft) "jY" = ( diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index e9f35248199f..37d26d36b557 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -3,11 +3,11 @@ #include "bearcat_access.dm" /obj/abstract/submap_landmark/joinable_submap/bearcat - name = "FTV Bearcat" + name = "FTV Bearcat" archetype = /decl/submap_archetype/derelict/bearcat /decl/submap_archetype/derelict/bearcat - descriptor = "derelict cargo vessel" + name = "derelict cargo vessel" crew_jobs = list( /datum/job/submap/bearcat_captain, /datum/job/submap/bearcat_crewman diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 44ea8318132f..f9fa8619ce6e 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -152,7 +152,7 @@ /area/casino/casino_bridge) "aw" = ( /obj/item/wirecutters, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ax" = ( diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index e136fdc492c1..fee5cdfb47d0 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -1095,7 +1095,7 @@ pixel_x = -6; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "merchant_ship_vent" }, @@ -2340,8 +2340,8 @@ /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/sheet/reinforced/mapped/fiberglass/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/forty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, @@ -5774,7 +5774,7 @@ pixel_x = -28; pixel_y = -10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/structure/cable/blue{ icon_state = "1-4" @@ -7523,8 +7523,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/reinforced/mapped/titanium/fifty, /obj/item/stack/material/sheet/reinforced/mapped/ocp/fifty, diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 72d4d2ddbb2c..4d3b627143f2 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -1,6 +1,6 @@ // Submap datum and archetype. /decl/submap_archetype/liberia - descriptor = "merchant ship" + name = "merchant ship" crew_jobs = list( /datum/job/submap/merchant ) diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 94c58cd1b3fb..aac57b9b881e 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -117,14 +117,14 @@ /turf/floor/plating/airless, /area/space) "aq" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ar" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/space) @@ -760,7 +760,7 @@ /turf/floor/plating/airless, /area/lost_supply_base) "cf" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/lost_supply_base) diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index 9148970f57f8..de625ae93469 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -106,7 +106,7 @@ /turf/floor/plating/airless, /area/space) "ao" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ap" = ( @@ -529,7 +529,7 @@ /turf/space, /area/magshield/smes_storage) "bF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/smes_storage) "bG" = ( @@ -1265,7 +1265,7 @@ /turf/floor/plating/airless, /area/magshield/north) "dF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/plating/airless, /area/magshield/north) "dG" = ( @@ -2750,11 +2750,11 @@ /turf/floor/carpet/blue, /area/magshield/west) "ic" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/tiled/dark, /area/magshield/west) "id" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/west) "ie" = ( @@ -3769,7 +3769,7 @@ /turf/floor/tiled, /area/magshield/south) "lg" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/south) "lh" = ( diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 8fcfad22c51a..68863f236667 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -339,22 +339,22 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1 }, @@ -377,7 +377,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "by" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bz" = ( @@ -407,7 +407,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/noticeboard/anomaly{ default_pixel_y = 32 }, @@ -420,22 +420,22 @@ /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bD" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bE" = ( /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bF" = ( @@ -459,13 +459,13 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/cigbutt/cigarbutt, /turf/floor, /area/outpost/abandoned) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bK" = ( @@ -473,8 +473,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bM" = ( @@ -482,7 +482,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -497,14 +497,14 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 10 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small, /turf/floor, /area/outpost/abandoned) @@ -525,7 +525,7 @@ /obj/effect/floor_decal/corner/purple{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bV" = ( @@ -570,7 +570,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cc" = ( @@ -582,7 +582,7 @@ dir = 1; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cd" = ( @@ -590,8 +590,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "ce" = ( @@ -604,7 +604,7 @@ /obj/effect/floor_decal/corner/red/three_quarters{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -612,7 +612,7 @@ /obj/effect/floor_decal/corner/red{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -632,8 +632,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "ck" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "cl" = ( @@ -663,12 +663,12 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/broken/three, /area/outpost/abandoned) "co" = ( /obj/structure/table/laminate, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/laminate, /area/outpost/abandoned) @@ -692,7 +692,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/outpost/abandoned) "ct" = ( @@ -710,13 +710,13 @@ /area/outpost/abandoned) "cv" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cx" = ( @@ -730,35 +730,35 @@ /turf/wall/titanium, /area/outpost/abandoned) "cG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall/titanium, /area/outpost/abandoned) "cH" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/outpost/abandoned) "cI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/outpost/abandoned) "cJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/broken/four, /area/outpost/abandoned) "cK" = ( /obj/effect/floor_decal/plaque, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/outpost/abandoned) "cL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/laminate/broken, /area/outpost/abandoned) @@ -801,19 +801,19 @@ /area/outpost/abandoned) "cU" = ( /obj/effect/floor_decal/corner/paleblue/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cV" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cX" = ( @@ -821,7 +821,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/loot, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -829,12 +829,12 @@ /obj/effect/floor_decal/corner/paleblue/three_quarters{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cZ" = ( /obj/effect/floor_decal/corner/red/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "da" = ( @@ -844,7 +844,7 @@ /obj/effect/floor_decal/corner/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "db" = ( @@ -866,7 +866,7 @@ /area/outpost/abandoned) "dd" = ( /obj/structure/barricade, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "de" = ( @@ -889,7 +889,7 @@ /area/outpost/abandoned) "df" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/blast/regular{ id_tag = "mars_blast" }, @@ -899,31 +899,31 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dh" = ( /turf/floor/carpet/broken, /area/outpost/abandoned) "di" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dl" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dm" = ( @@ -1021,7 +1021,7 @@ /obj/item/shard{ icon_state = "shardlarge" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dF" = ( @@ -1032,7 +1032,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dG" = ( @@ -1121,16 +1121,16 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken, /area/outpost/abandoned) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dY" = ( @@ -1143,7 +1143,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dZ" = ( @@ -1154,18 +1154,18 @@ /turf/wall/titanium, /area/outpost/abandoned) "ea" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/mop, /turf/floor/plating/broken/two, /area/outpost/abandoned) "ec" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1199,7 +1199,7 @@ /turf/floor/barren, /area/mine/explored) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "ek" = ( @@ -1244,13 +1244,13 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "es" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "et" = ( @@ -1260,15 +1260,15 @@ dir = 1 }, /obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eu" = ( /obj/abstract/landmark/mapped_fluid/fuel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/bot/medbot, /turf/floor/tiled/white/airless, /area/outpost/abandoned) @@ -1289,13 +1289,13 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/gibspawner/human, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1322,7 +1322,7 @@ /area/outpost/abandoned) "eF" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, @@ -1340,7 +1340,7 @@ /turf/floor/plating, /area/outpost/abandoned) "eI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external, /turf/floor/plating, /area/outpost/abandoned) @@ -1348,27 +1348,27 @@ /obj/item/shard{ icon_state = "shardsmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eK" = ( /obj/item/shard{ icon_state = "piecesmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eM" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eO" = ( @@ -1381,7 +1381,7 @@ /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/four, /area/outpost/abandoned) "eQ" = ( @@ -1423,15 +1423,15 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1439,9 +1439,9 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/generic, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1449,8 +1449,8 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/wrench, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1458,7 +1458,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1472,7 +1472,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1481,7 +1481,7 @@ /turf/floor/plating/broken/one, /area/outpost/abandoned) "fc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, @@ -1495,25 +1495,25 @@ /turf/floor/tiled/airless, /area/mine/explored) "ff" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/barren, /area/mine/explored) "fg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/cee, /turf/floor/plating, /area/outpost/abandoned) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fi" = ( /obj/item/pen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fj" = ( @@ -1539,8 +1539,8 @@ /area/outpost/abandoned) "fo" = ( /obj/random/medical, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fq" = ( @@ -1560,33 +1560,33 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fs" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/vomit, /turf/floor/tiled/airless, /area/outpost/abandoned) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /turf/floor/plating/broken/four, /area/outpost/abandoned) "fu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/mopbucket, /turf/floor/tiled/airless, /area/outpost/abandoned) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/remains, /turf/floor/tiled/airless, /area/outpost/abandoned) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/plating/broken/one, /area/outpost/abandoned) "fx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1638,8 +1638,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fG" = ( @@ -1647,8 +1647,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fH" = ( @@ -1659,7 +1659,7 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/window/basic{ dir = 4 }, @@ -1695,7 +1695,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ dir = 4; icon_state = "0-2" @@ -1707,7 +1707,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency, /obj/structure/cable{ dir = 4; @@ -1720,7 +1720,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/mine/explored) "fS" = ( @@ -1729,7 +1729,7 @@ /turf/floor/tiled/dark, /area/outpost/abandoned) "fT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 1; icon_state = "firex"; @@ -1783,7 +1783,7 @@ /obj/structure/bed/chair{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gb" = ( @@ -1791,7 +1791,7 @@ /area/mine/explored) "gc" = ( /obj/item/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gd" = ( @@ -1822,17 +1822,17 @@ /turf/floor/plating, /area/outpost/abandoned) "gi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/proc_caller/floor_breaker, /turf/floor/tiled/airless/broken, /area/mine/explored) "gj" = ( /obj/machinery/door/airlock/hatch, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/terminal{ dir = 1 }, @@ -1849,7 +1849,7 @@ /turf/floor/plating/broken/two, /area/outpost/abandoned) "gn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 4; icon_state = "warning" @@ -1891,16 +1891,16 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gv" = ( @@ -1927,7 +1927,7 @@ /turf/floor/plating, /area/outpost/abandoned) "gy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 8; icon_state = "bulb1" @@ -1966,7 +1966,7 @@ /area/outpost/abandoned) "gE" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gF" = ( @@ -1996,8 +1996,8 @@ /turf/floor/plating, /area/outpost/abandoned) "gK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "2-8" }, @@ -2012,7 +2012,7 @@ /turf/floor/barren, /area/mine/explored) "gN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/firedoor, /obj/structure/cable/orange{ icon_state = "1-2" @@ -2021,7 +2021,7 @@ /area/outpost/abandoned) "gO" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/firedoor_assembly{ anchored = 1 }, @@ -2040,7 +2040,7 @@ /turf/floor/barren, /area/outpost/abandoned) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "1-2" }, @@ -2210,7 +2210,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2311,7 +2311,7 @@ /area/outpost/abandoned) "hD" = ( /obj/random/junk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2339,7 +2339,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/away, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -2382,7 +2382,7 @@ /obj/effect/floor_decal/corner/red{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/dark, @@ -2392,9 +2392,9 @@ dir = 4 }, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -2429,10 +2429,10 @@ dir = 4 }, /obj/effect/decal/cleanable/vomit, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "wb" = ( @@ -2454,7 +2454,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 4; icon_state = "bulb1" @@ -2462,8 +2462,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "HD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "IX" = ( diff --git a/maps/away/slavers/icons/abolitionist.dmi b/maps/away/slavers/icons/abolitionist.dmi deleted file mode 100644 index b56da3bc7065..000000000000 Binary files a/maps/away/slavers/icons/abolitionist.dmi and /dev/null differ diff --git a/maps/away/slavers/icons/areas.dmi b/maps/away/slavers/icons/areas.dmi deleted file mode 100644 index cc911c14cd2c..000000000000 Binary files a/maps/away/slavers/icons/areas.dmi and /dev/null differ diff --git a/maps/away/slavers/icons/uniform.dmi b/maps/away/slavers/icons/uniform.dmi deleted file mode 100644 index 841007db55fb..000000000000 Binary files a/maps/away/slavers/icons/uniform.dmi and /dev/null differ diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm deleted file mode 100644 index 697a24856d31..000000000000 --- a/maps/away/slavers/slavers_base.dm +++ /dev/null @@ -1,185 +0,0 @@ -#include "slavers_base_areas.dm" -#include "../mining/mining_areas.dm" - -/obj/effect/overmap/visitable/sector/slavers_base - name = "large asteroid" - desc = "Sensor array is reading an artificial structure inside the asteroid." - icon_state = "object" - initial_generic_waypoints = list( - "nav_slavers_base_1", - "nav_slavers_base_2", - "nav_slavers_base_3", - "nav_slavers_base_4", - "nav_slavers_base_5", - "nav_slavers_base_6", - "nav_slavers_base_antag" - ) - -/datum/map_template/ruin/away_site/slavers - name = "Slavers' Base" - description = "Asteroid with slavers base inside." - suffixes = list("slavers/slavers_base.dmm") - cost = 1 - level_data_type = /datum/level_data/mining_level - area_usage_test_exempted_root_areas = list(/area/slavers_base) - apc_test_exempt_areas = list( - /area/slavers_base/hangar = NO_SCRUBBER - ) - -/obj/effect/shuttle_landmark/nav_slavers_base/nav1 - name = "Slavers Base Navpoint #1" - landmark_tag = "nav_slavers_base_1" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav2 - name = "Slavers Base Navpoint #2" - landmark_tag = "nav_slavers_base_2" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav3 - name = "Slavers Base Navpoint #3" - landmark_tag = "nav_slavers_base_3" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav4 - name = "Slavers Base Navpoint #4" - landmark_tag = "nav_slavers_base_4" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav5 - name = "Slavers Base Navpoint #5" - landmark_tag = "nav_slavers_base_5" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav6 - name = "Slavers Base Navpoint #6" - landmark_tag = "nav_slavers_base_6" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav7 - name = "Slavers Base Navpoint #7" - landmark_tag = "nav_slavers_base_antag" - -/decl/outfit/corpse - name = "Corpse Clothing" - abstract_type = /decl/outfit/corpse - -/decl/outfit/corpse/slavers_base - name = "Basic slaver output" - -/obj/abstract/landmark/corpse/slavers_base - abstract_type = /obj/abstract/landmark/corpse/slavers_base - -/obj/abstract/landmark/corpse/slavers_base/slaver1 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver1) - -/decl/outfit/corpse/slavers_base/slaver1 - name = "Dead Slaver 1" - uniform = /obj/item/clothing/jumpsuit/johnny - shoes = /obj/item/clothing/shoes/color/black - glasses = /obj/item/clothing/glasses/sunglasses - -/obj/abstract/landmark/corpse/slavers_base/slaver2 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver2) - -/decl/outfit/corpse/slavers_base/slaver2 - name = "Dead Slaver 2" - uniform = /obj/item/clothing/jumpsuit/johnny - shoes = /obj/item/clothing/shoes/color/blue - -/obj/abstract/landmark/corpse/slavers_base/slaver3 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver3) - -/decl/outfit/corpse/slavers_base/slaver3 - name = "Dead Slaver 3" - uniform = /obj/item/clothing/costume/pirate - shoes = /obj/item/clothing/shoes/color/brown - -/obj/abstract/landmark/corpse/slavers_base/slaver4 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver4) - -/decl/outfit/corpse/slavers_base/slaver4 - name = "Dead Slaver 4" - uniform = /obj/item/clothing/costume/redcoat - shoes = /obj/item/clothing/shoes/color/brown - -/obj/abstract/landmark/corpse/slavers_base/slaver5 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver5) - -/decl/outfit/corpse/slavers_base/slaver5 - name = "Dead Slaver 5" - uniform = /obj/item/clothing/jumpsuit/sterile - shoes = /obj/item/clothing/shoes/color/orange - mask = /obj/item/clothing/mask/surgical - -/obj/abstract/landmark/corpse/slavers_base/slaver6 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver6) - -/decl/outfit/corpse/slavers_base/slaver6 - name = "Dead Slaver 6" - uniform = /obj/item/clothing/shirt/flannel/red/outfit - shoes = /obj/item/clothing/shoes/color/orange - -/obj/abstract/landmark/corpse/slavers_base/slave - name = "Slave" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slave) - -/decl/outfit/corpse/slavers_base/slave - name = "Dead Slave" - uniform = /obj/item/clothing/jumpsuit/orange - shoes = /obj/item/clothing/shoes/jackboots/tactical - -/mob/living/simple_animal/hostile/abolition_extremist - name = "abolition extremist" - desc = "Vigiliant fighter against slavery." - icon = 'maps/away/slavers/icons/abolitionist.dmi' - - max_health = 100 - natural_weapon = /obj/item/natural_weapon/punch - unsuitable_atmos_damage = 15 - projectilesound = 'sound/weapons/laser.ogg' - projectiletype = /obj/item/projectile/beam - faction = "extremist abolitionists" - ai = /datum/mob_controller/abolitionist - var/corpse = /obj/abstract/landmark/corpse/abolitionist - var/weapon = /obj/item/gun/energy/laser - -/mob/living/simple_animal/hostile/abolition_extremist/has_ranged_attack() - return TRUE - -/datum/mob_controller/abolitionist - speak_chance = 0 - turns_per_wander = 10 - stop_wander_when_pulled = 0 - can_escape_buckles = TRUE - -/mob/living/simple_animal/hostile/abolition_extremist/death(gibbed) - . = ..() - if(. && !gibbed) - if(corpse) - new corpse(loc) - if(weapon) - new weapon(loc) - qdel(src) - -/obj/abstract/landmark/corpse/abolitionist - name = "abolitionist" - corpse_outfits = list(/decl/outfit/corpse/abolitionist) - -/decl/outfit/corpse/abolitionist - name = "Dead abolitionist" - uniform = /obj/item/clothing/jumpsuit/abolitionist - shoes = /obj/item/clothing/shoes/jackboots - head = /obj/item/clothing/head/helmet/merc - -/obj/item/clothing/jumpsuit/abolitionist - name = "abolitionist combat suit" - desc = "Lightly armored suit worn by abolition extremists during raids. It has green patches on the right sleeve and the chest. There is big green \"A\" on the back." - icon = 'maps/away/slavers/icons/uniform.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm deleted file mode 100644 index 7b49c294d412..000000000000 --- a/maps/away/slavers/slavers_base.dmm +++ /dev/null @@ -1,44306 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space, -/area/space) -"ab" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav2, -/turf/space, -/area/space) -"ac" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav3, -/turf/space, -/area/space) -"ad" = ( -/turf/unsimulated/mask, -/area/mine/unexplored) -"ae" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav1, -/turf/space, -/area/space) -"af" = ( -/turf/wall/natural, -/area/space) -"ag" = ( -/turf/floor, -/area/space) -"ah" = ( -/turf/wall, -/area/slavers_base/mort) -"ai" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav4, -/turf/space, -/area/space) -"aj" = ( -/obj/structure/ore_box{ - desc = "A heavy box covered with dried blood."; - name = "Big dirty box" - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ak" = ( -/turf/floor/plating/airless, -/area/slavers_base/mort) -"al" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"am" = ( -/obj/structure/morgue, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"an" = ( -/obj/effect/decal/cleanable/ash, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ao" = ( -/obj/structure/table, -/obj/item/wirecutters, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ap" = ( -/obj/structure/table, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aq" = ( -/obj/structure/table, -/obj/item/paper{ - info = "If they'll keep having fun with cargo in such manner, we'll run out of freezers to keep what's left from it."; - name = "Note" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ar" = ( -/obj/structure/table, -/obj/item/utensil/knife, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"as" = ( -/obj/structure/rack, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"at" = ( -/obj/effect/gibspawner/human, -/turf/floor, -/area/space) -"au" = ( -/obj/structure/rack, -/obj/item/wirecutters, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"av" = ( -/obj/item/tool/shovel, -/turf/floor, -/area/space) -"aw" = ( -/obj/item/remains/human, -/turf/floor, -/area/space) -"ax" = ( -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ay" = ( -/obj/item/bodybag, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"az" = ( -/obj/item/utensil/knife, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aA" = ( -/obj/structure/rack, -/obj/item/tool/axe/hatchet, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aB" = ( -/obj/structure/closet/crate/freezer, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aC" = ( -/obj/effect/gibspawner/human, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aD" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aE" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slaves Mortuary"; - pixel_x = 24 - }, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aF" = ( -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aG" = ( -/obj/machinery/gibber, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aH" = ( -/obj/structure/meat_hook, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aI" = ( -/obj/structure/meat_hook, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aK" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aL" = ( -/obj/machinery/door/airlock{ - name = "Mortuary backyard" - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aM" = ( -/turf/wall, -/area/slavers_base/cells) -"aN" = ( -/obj/machinery/door/airlock{ - name = "Slaves mortuary" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aO" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aP" = ( -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aQ" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aR" = ( -/obj/structure/mattress/dirty, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aS" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aV" = ( -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aW" = ( -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aX" = ( -/obj/structure/hygiene/shower{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aY" = ( -/obj/item/chems/glass/rag, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aZ" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/drinks/cans/waterbottle, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ba" = ( -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bc" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bd" = ( -/obj/structure/mattress/dirty, -/obj/item/trash/liquidfood, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"be" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bf" = ( -/obj/item/chems/drinks/cans/waterbottle, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bg" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bh" = ( -/obj/structure/mattress/dirty, -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bi" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bj" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bk" = ( -/obj/machinery/door/window/brigdoor/southright, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bl" = ( -/obj/machinery/door/window/brigdoor/southright, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bo" = ( -/obj/machinery/door/airlock{ - name = "Cell block B" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"br" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bs" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bu" = ( -/obj/structure/mattress/dirty, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bv" = ( -/obj/structure/closet/crate/plastic/rations, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bw" = ( -/obj/item/paper{ - info = "Tonight, when lights are out. Prepare shivs, pieces of glass, whatever you might find."; - name = "Note" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"by" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"bz" = ( -/obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bA" = ( -/obj/random/trash, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/remains/human, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bC" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bD" = ( -/obj/random/shoes, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bE" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bG" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bH" = ( -/obj/machinery/door/window/brigdoor/northright, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bI" = ( -/obj/random/trash, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bJ" = ( -/obj/item/bag/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bK" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bL" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bM" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bN" = ( -/obj/machinery/door/airlock{ - name = "Den B" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bO" = ( -/obj/machinery/light/small/red, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bP" = ( -/obj/machinery/light/small/red, -/obj/structure/mattress/dirty, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bQ" = ( -/obj/structure/mattress/dirty, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bR" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bU" = ( -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bV" = ( -/obj/random/trash, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bW" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/ammo_casing/shotgun/beanbag{ - pixel_y = 5; - pixel_z = 7 - }, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bX" = ( -/obj/machinery/door/airlock{ - name = "Dens block" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/abstract/landmark/corpse/slavers_base/slaver4, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"ca" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cb" = ( -/obj/machinery/door/airlock{ - name = "Den A" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cd" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ce" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/obj/structure/mattress/dirty, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cf" = ( -/obj/structure/mattress/dirty, -/obj/random/snack, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cg" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/obj/random/medical/lite, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ch" = ( -/obj/structure/mattress/dirty, -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ci" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ck" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/flashlight, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cm" = ( -/turf/wall, -/area/slavers_base/hangar) -"cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"co" = ( -/obj/machinery/door/airlock{ - name = "Cell block A" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cs" = ( -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ct" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cu" = ( -/obj/machinery/door/blast/regular{ - id_tag = "service_hangar" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cv" = ( -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cx" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cy" = ( -/obj/random/medical/lite, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slavers holding area"; - pixel_x = 24 - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cB" = ( -/obj/machinery/door/window/brigdoor/northright, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cC" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 9; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cD" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cE" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 5; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cF" = ( -/obj/item/paper, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cG" = ( -/obj/item/trash/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cH" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cI" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 4; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cJ" = ( -/obj/item/paper{ - info = "Doc who checked us told implants won't explode our heads. Gotta make guys know. Seems I see a silver lining."; - name = "Note" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cK" = ( -/obj/machinery/light/small/red, -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cL" = ( -/obj/random/snack, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cM" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/drinks/cans/waterbottle, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cN" = ( -/obj/machinery/light/small/red, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cO" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/obj/item/chems/drinks/cans/waterbottle, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cP" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/obj/item/trash/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cQ" = ( -/obj/machinery/light/small/red, -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cR" = ( -/turf/wall, -/area/slavers_base/powatm) -"cS" = ( -/turf/wall, -/area/slavers_base/secwing) -"cT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"cU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"cV" = ( -/turf/wall, -/area/slavers_base/med) -"cW" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav7, -/turf/space, -/area/space) -"cX" = ( -/obj/machinery/atmospherics/unary/tank/air, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"cY" = ( -/obj/machinery/atmospherics/unary/tank/air, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"cZ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"da" = ( -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"db" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dc" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dd" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"de" = ( -/obj/structure/closet, -/obj/random/snack, -/obj/random/projectile, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"df" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dg" = ( -/obj/structure/bed, -/obj/random/projectile, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dh" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/masks, -/obj/random/suit, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"di" = ( -/obj/structure/rack, -/obj/item/flashlight, -/obj/random/medical/lite, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dj" = ( -/obj/structure/rack, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/box/handcuffs, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dk" = ( -/obj/structure/rack, -/obj/item/baton, -/obj/item/baton, -/obj/item/baton, -/obj/random/tool, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dl" = ( -/obj/structure/rack, -/obj/item/flash, -/obj/random/ammo, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dm" = ( -/obj/structure/rack, -/obj/item/box/ammo/stunshells, -/obj/item/gun/projectile/shotgun/pump, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dn" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"do" = ( -/obj/structure/cable{ - icon_state = "0-6" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dp" = ( -/turf/floor/tiled, -/area/slavers_base/secwing) -"dq" = ( -/obj/structure/cable/cyan{ - icon_state = "0-4" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dr" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ds" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"du" = ( -/obj/machinery/door/airlock{ - name = "Slave processing" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dv" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "Medical room"; - pixel_y = 24 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/hygiene/shower{ - pixel_y = 30 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dA" = ( -/obj/machinery/door/airlock{ - name = "Storage" - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dB" = ( -/turf/floor/plating/airless, -/area/slavers_base/med) -"dC" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dD" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dE" = ( -/obj/structure/closet/crate/plastic/rations, -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dF" = ( -/obj/structure/closet/crate/plastic/rations, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dG" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dH" = ( -/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dI" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dJ" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dK" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dL" = ( -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dM" = ( -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dN" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dO" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dP" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dQ" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-9" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dR" = ( -/obj/structure/table/steel, -/obj/item/box/ammo/stunshells, -/obj/item/baton, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dS" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/medical/lite, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dY" = ( -/obj/structure/bed, -/obj/item/remains/human, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dZ" = ( -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/med) -"ea" = ( -/obj/structure/closet/crate/trashcart, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eb" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 10; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ec" = ( -/obj/effect/floor_decal/industrial/warning, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ed" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 6 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ee" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 1; - name = "waste pump" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ef" = ( -/obj/machinery/atmospherics/binary/pump, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eg" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eh" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ei" = ( -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ej" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled, -/area/slavers_base/secwing) -"ek" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/secwing) -"el" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver6, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"em" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"en" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eo" = ( -/obj/structure/bed/chair/office/dark{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"ep" = ( -/obj/structure/table/steel, -/obj/item/flash, -/obj/item/radio/shortwave, -/obj/item/paper{ - info = "If this fuck from A-3 keeps thinking he's better then piece of meat, throw him to hangar and show how little pressure turns diamonds into shit."; - name = "Note" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eq" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"er" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"es" = ( -/obj/item/ammo_casing/shotgun/beanbag, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"et" = ( -/obj/structure/window/basic{ - dir = 1 - }, -/obj/item/clothing/gloves/latex, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eu" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/abstract/landmark/corpse/slavers_base/slaver5, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ev" = ( -/obj/structure/window/basic{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ew" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ex" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ey" = ( -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ez" = ( -/obj/structure/bed, -/obj/item/handcuffs, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eA" = ( -/obj/item/beartrap, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eB" = ( -/obj/item/mop, -/obj/structure/mopbucket, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eC" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"eD" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eE" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eF" = ( -/obj/random/tool, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eG" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eH" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eK" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eL" = ( -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eM" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eN" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eO" = ( -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eP" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eQ" = ( -/obj/machinery/computer/modular{ - name = "Cameras console" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eR" = ( -/obj/machinery/computer/modular{ - name = "Riot control console" - }, -/obj/machinery/power/apc{ - name = "Slavers security wing"; - pixel_y = -24 - }, -/obj/structure/cable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eS" = ( -/obj/structure/table/steel, -/obj/item/handcuffs, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eT" = ( -/obj/item/gun/projectile/shotgun/pump, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"eU" = ( -/obj/machinery/optable, -/obj/item/scalpel, -/obj/effect/decal/cleanable/blood, -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eV" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/structure/table, -/obj/item/implanter, -/obj/item/implantcase/tracking, -/obj/item/surgicaldrill, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eW" = ( -/obj/machinery/optable, -/obj/effect/decal/cleanable/blood, -/obj/item/screwdriver, -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eX" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/structure/table, -/obj/item/implantpad, -/obj/item/chems/pill/antibiotics, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eY" = ( -/obj/structure/table, -/obj/item/firstaid/empty, -/obj/item/handcuffs, -/obj/item/baton, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eZ" = ( -/obj/structure/table, -/obj/item/firstaid/o2, -/obj/item/folder/cyan, -/obj/item/paper{ - info = "Seems they don't really look over my shoulder anymore. We have now maybe a dozen of them with inactive implants. Hope they will pick right moment to flip the lid. I'll kill few bastards myself soon as I have a chance."; - name = "Note" - }, -/obj/item/pen, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fa" = ( -/obj/structure/table, -/obj/item/firstaid/regular, -/obj/item/tool/axe/hatchet, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fb" = ( -/obj/item/roller, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fc" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fd" = ( -/obj/structure/table, -/obj/item/box/handcuffs, -/obj/item/box/handcuffs, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fe" = ( -/obj/structure/table, -/obj/item/box/bodybags, -/turf/floor/plating/airless, -/area/slavers_base/med) -"ff" = ( -/obj/structure/table, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fg" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fh" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fi" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fj" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - name = "Slavers hangar"; - pixel_y = -24 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fk" = ( -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fl" = ( -/obj/effect/decal/cleanable/generic, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fm" = ( -/obj/effect/decal/cleanable/generic, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"fo" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fp" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fq" = ( -/obj/machinery/door/airlock/external, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ft" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Power/atmos" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/plating/airless, -/area/slavers_base/hallway) -"fu" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable/green, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/obj/structure/cable/green{ - icon_state = "0-2" - }, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "West hallway" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fx" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fz" = ( -/obj/machinery/door/airlock{ - name = "Transit area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/maint) -"fA" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/power/terminal, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fF" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fG" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fH" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 9 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fJ" = ( -/turf/wall, -/area/slavers_base/maint) -"fK" = ( -/obj/machinery/atmospherics/unary/tank/carbon_dioxide, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fL" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 6 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fM" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow, -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fN" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 10 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fO" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fP" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fQ" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fR" = ( -/obj/machinery/door/airlock{ - name = "Power/atmos" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/plating/airless, -/area/slavers_base/hallway) -"fS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fT" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fU" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fV" = ( -/obj/machinery/door/airlock{ - name = "West hallway" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fY" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"ga" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gb" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gc" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gd" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ge" = ( -/obj/machinery/atmospherics/omni/filter{ - dir = 8 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gh" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slavers atmos and power room"; - pixel_x = 24 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gi" = ( -/turf/wall, -/area/slavers_base/dorms) -"gj" = ( -/obj/machinery/door/airlock{ - name = "Mess" - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gk" = ( -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gl" = ( -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gm" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gn" = ( -/obj/machinery/atmospherics/binary/pump, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"go" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gp" = ( -/obj/item/crowbar, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gr" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/item/stock_parts/circuitboard/broken, -/obj/item/poster, -/obj/item/radio/shortwave, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gs" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"gt" = ( -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gu" = ( -/obj/machinery/vending/wallmed2{ - pixel_y = 30 - }, -/obj/structure/table, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gv" = ( -/obj/structure/bed, -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gw" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/loot, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gx" = ( -/obj/structure/table, -/obj/random/coin, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gy" = ( -/obj/structure/bed, -/obj/random/plushie, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gz" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gA" = ( -/obj/structure/table, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gB" = ( -/obj/structure/closet, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gC" = ( -/obj/structure/table, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gD" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gE" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gF" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gI" = ( -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gJ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gK" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gL" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gM" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/item/toolbox/mechanical, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gN" = ( -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gQ" = ( -/obj/random/junk, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - name = "Slavers Maintenance"; - pixel_y = -24 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gT" = ( -/obj/machinery/door/airlock{ - name = "Exchange tunnel" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gV" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gW" = ( -/obj/machinery/floodlight, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gX" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gY" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"gZ" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"ha" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hb" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"hc" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hd" = ( -/turf/wall, -/area/slavers_base/demo) -"he" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hf" = ( -/obj/machinery/light/small{ - dir = 4; - pixel_y = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hg" = ( -/obj/item/coilgun_assembly, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hh" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hk" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hl" = ( -/obj/structure/bed, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hm" = ( -/obj/structure/closet, -/obj/random/projectile, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hn" = ( -/obj/structure/table, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"ho" = ( -/obj/structure/table, -/obj/random/gloves, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hp" = ( -/obj/structure/closet, -/obj/random/loot, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hq" = ( -/obj/structure/closet, -/obj/random/projectile, -/obj/random/ammo, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hr" = ( -/obj/structure/safe, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hs" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/safe, -/obj/item/bag/cash, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ht" = ( -/obj/structure/safe, -/obj/item/bag/cash, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hu" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hv" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hw" = ( -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hx" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hy" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hz" = ( -/obj/machinery/vending/engineering{ - req_access = list() - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hA" = ( -/obj/item/stock_parts/computer/card_slot, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hB" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hC" = ( -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hE" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hG" = ( -/obj/machinery/door/airlock{ - name = "Safe room" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hI" = ( -/obj/random/coin, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hJ" = ( -/obj/machinery/door/airlock{ - name = "Cashier room" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hL" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hM" = ( -/obj/structure/table/reinforced, -/obj/random/coin, -/obj/machinery/door/blast/regular/open{ - id_tag = "SC BD" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hN" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hO" = ( -/obj/structure/table/laminate, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hP" = ( -/obj/structure/table/laminate, -/obj/item/secure_storage/briefcase/money, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hQ" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hR" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hS" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hV" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/vending/dinnerware, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hW" = ( -/obj/machinery/cooker/oven, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hX" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hY" = ( -/obj/structure/table, -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hZ" = ( -/obj/structure/table, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ia" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/plate, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ib" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ic" = ( -/turf/floor/tiled, -/area/slavers_base/dorms) -"id" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ie" = ( -/obj/structure/closet/secure_closet/guncabinet, -/obj/random/projectile, -/obj/random/projectile, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"if" = ( -/obj/structure/closet/secure_closet/guncabinet, -/obj/random/projectile, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ig" = ( -/obj/random/coin, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ih" = ( -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ii" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ij" = ( -/obj/structure/table/laminate, -/obj/item/bag/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ik" = ( -/obj/structure/table/laminate, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"il" = ( -/obj/structure/ore_box, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"in" = ( -/obj/structure/closet/crate, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"io" = ( -/obj/structure/closet/crate, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"iq" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ir" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"is" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"it" = ( -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"iu" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iv" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ix" = ( -/obj/machinery/vending/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iy" = ( -/obj/structure/table/laminate, -/obj/item/paper{ - info = "
Contract

This contract describes exchanging of monetary pieces for the right o? the ownership for following examples: <*> Human, age 17. Price - 1500cr. <*> Human, age 49. Price - 1100cr. <*> Human, age 28. Good fist fighter. Price - 2400cr. <*> Human, age 34. Expirienced medic. Price - 6800cr. Overall price: 11800cr
Place for signatures"; - name = "Contract" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iz" = ( -/obj/structure/table/laminate, -/obj/random/coin, -/obj/item/pen, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iA" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iE" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iF" = ( -/obj/machinery/vending/fitness, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iG" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"iH" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"iI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iJ" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iK" = ( -/obj/item/clothing/suit/nun, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iL" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/clothing/suit/robe/yellowed, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iM" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - name = "Slavers Dorms"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iO" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/chems/condiment/small/peppermill, -/obj/item/chems/condiment/small/saltshaker{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iP" = ( -/obj/structure/table, -/obj/random/smokes, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iQ" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iR" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/utensil/fork, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iS" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iT" = ( -/obj/random/junk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iU" = ( -/obj/item/utensil/fork, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iV" = ( -/obj/machinery/vending/cola, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"iX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"iY" = ( -/obj/machinery/door/airlock{ - name = "Scene" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ja" = ( -/obj/item/clothing/shoes/color/brown, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jb" = ( -/obj/item/clothing/pants/pj/blue, -/obj/item/clothing/shirt/pj/blue, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jc" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jd" = ( -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"je" = ( -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/wall, -/area/slavers_base/dorms) -"jg" = ( -/obj/structure/table, -/obj/random/projectile, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jh" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ji" = ( -/obj/structure/table, -/obj/item/plate, -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jj" = ( -/obj/structure/table, -/obj/item/utensil/fork, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jk" = ( -/obj/structure/table, -/obj/random/smokes, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jl" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/vending/cigarette, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jm" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jn" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jo" = ( -/obj/machinery/door/airlock{ - name = "Private office" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jp" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jq" = ( -/obj/structure/table, -/obj/item/radio/shortwave, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jr" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"js" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc{ - dir = 8; - name = "west bump"; - pixel_x = -24 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ju" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jv" = ( -/turf/floor/tiled, -/area/slavers_base/demo) -"jw" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jy" = ( -/obj/structure/cable/green, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jz" = ( -/obj/structure/cable, -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jA" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jB" = ( -/obj/machinery/light, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jC" = ( -/obj/item/paper{ - info = "We made over 200 grands for two last weeks. We should stay low-key for month or so, or we'll get our base discovered by fucking marshalls so shut your whining and relax, I'l l get you three crates of booze and some cargo to play with."; - name = "Note" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jD" = ( -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jE" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jF" = ( -/obj/machinery/door/airlock{ - name = "Mess" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"jG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jI" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jJ" = ( -/obj/structure/table, -/obj/item/megaphone, -/turf/floor/tiled, -/area/slavers_base/demo) -"jK" = ( -/obj/structure/table, -/obj/item/clothing/mask/smokable/cigarette, -/turf/floor/tiled, -/area/slavers_base/demo) -"jL" = ( -/obj/structure/table, -/turf/floor/tiled, -/area/slavers_base/demo) -"jM" = ( -/obj/structure/table, -/obj/item/scanner/health, -/turf/floor/tiled, -/area/slavers_base/demo) -"jN" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/turf/floor/tiled, -/area/slavers_base/demo) -"jO" = ( -/obj/structure/table, -/obj/item/pen, -/turf/floor/tiled, -/area/slavers_base/demo) -"jP" = ( -/obj/machinery/door/airlock{ - name = "Restroom" - }, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"jQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jR" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled, -/area/slavers_base/demo) -"jS" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jT" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jU" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/item/secure_storage/briefcase/money, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/turf/floor/tiled, -/area/slavers_base/demo) -"jV" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jW" = ( -/obj/structure/table, -/obj/item/clothing/mask/smokable/cigarette/professionals, -/turf/floor/tiled, -/area/slavers_base/demo) -"jX" = ( -/obj/structure/hygiene/shower{ - dir = 4 - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"jY" = ( -/obj/machinery/door/airlock{ - name = "Shower" - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"jZ" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver3, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"ka" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kb" = ( -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kc" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver1, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kd" = ( -/obj/machinery/door/airlock{ - name = "Toilet" - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"ke" = ( -/obj/structure/hygiene/toilet{ - dir = 8 - }, -/obj/random/junk, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"kf" = ( -/turf/wall, -/area/slavers_base/hallway) -"kg" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ki" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"kj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kk" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/demo) -"kl" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/demo) -"km" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kn" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"ko" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kq" = ( -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kr" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ks" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - name = "south bump"; - pixel_y = -24 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"ku" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kv" = ( -/obj/structure/table, -/obj/item/box/glass_extras, -/turf/floor/tiled, -/area/slavers_base/demo) -"kw" = ( -/obj/structure/table, -/obj/machinery/chemical_dispenser/bar_alc, -/turf/floor/tiled, -/area/slavers_base/demo) -"kz" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kA" = ( -/obj/machinery/door/airlock{ - name = "Customers entry" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kB" = ( -/obj/machinery/door/airlock{ - name = "Customers entry" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kE" = ( -/obj/machinery/door/airlock{ - name = "Exchange area" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kF" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kH" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kI" = ( -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kJ" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kK" = ( -/obj/machinery/door/airlock{ - name = "Exchange point" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kL" = ( -/obj/machinery/atmospherics/binary/pump, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kM" = ( -/obj/structure/table, -/obj/item/radio/shortwave, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kN" = ( -/obj/structure/table, -/obj/random/handgun, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kO" = ( -/obj/machinery/door/airlock/external, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kP" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kQ" = ( -/obj/structure/table, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kR" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kS" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kT" = ( -/obj/structure/table, -/obj/random/loot, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kU" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 1; - id_tag = "solar_port_pump" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kW" = ( -/obj/effect/overmap/visitable/sector/slavers_base, -/turf/space, -/area/space) -"kX" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav5, -/turf/space, -/area/space) -"kY" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav6, -/turf/space, -/area/space) -"lb" = ( -/obj/structure/hygiene/sink{ - pixel_y = -20 - }, -/obj/structure/mirror{ - pixel_y = -35 - }, -/obj/abstract/landmark/corpse/slavers_base/slaver2, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"mb" = ( -/obj/structure/hygiene/sink{ - pixel_y = -20 - }, -/obj/structure/mirror{ - pixel_y = -35 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"nm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"EJ" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -ad -ad -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ai -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -kX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dG -ee -eD -da -da -fK -gb -gn -gL -gW -gW -hz -da -il -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dH -ef -eE -da -da -fK -gc -go -go -da -da -da -da -il -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dI -da -da -da -da -da -gd -da -go -da -hg -da -da -in -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cY -dI -da -eF -da -da -fL -by -da -da -da -da -da -da -io -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cZ -dJ -eg -dG -eg -eg -fM -ge -gp -da -da -da -hA -da -in -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -da -da -cZ -eG -da -da -fN -ge -da -eF -da -hh -da -da -iq -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cZ -cZ -da -eH -da -da -da -EJ -da -da -da -da -da -da -ir -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -db -cZ -da -eI -fl -da -fO -gf -da -da -eF -da -da -da -is -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -dc -dK -da -eJ -fm -fr -fP -gg -gq -gq -gq -gq -hB -da -ir -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -dc -da -dK -eK -da -fs -fQ -gh -gr -gM -gX -gX -hC -hR -it -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ah -ah -ah -ah -ah -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -cS -cS -cS -cS -cS -cS -ft -fR -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -aj -aj -ak -ak -ak -aM -aO -aX -bi -aP -aP -aP -aP -aM -bR -aM -aP -aP -aP -aP -bi -aX -aO -cS -dd -dL -dL -eL -fn -fu -fS -gj -gs -gs -gY -gs -gs -hS -iu -iA -iu -je -jp -jy -gi -jX -gi -jX -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -aj -ak -ak -aM -aP -aP -aP -aR -aV -aP -aP -aM -aU -aM -aW -aZ -aP -cv -ba -aW -aP -cS -de -dL -eh -eM -cS -fv -fo -gi -gi -gi -gi -gi -gi -hT -ic -ic -iM -jf -jq -jz -gi -jY -gi -jY -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -aj -ak -aM -aP -aY -aW -be -aP -aR -aW -bK -aU -bK -aP -aP -aP -be -aP -aP -cJ -cS -df -dL -dL -eM -cS -fv -fo -gi -gt -gt -gZ -hj -hD -hU -iv -ic -iN -gi -gi -gi -gi -jZ -kn -kb -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -al -aj -ak -ak -aF -aM -aQ -aP -aR -aP -aP -aP -aP -bL -bS -ca -aP -aP -aP -ch -aP -aP -bO -cS -dg -dL -ei -eM -cS -fv -fT -gi -gu -gt -gt -hk -gi -hT -ic -ic -iN -ic -ic -jA -jP -ka -kb -lb -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ax -ak -ak -aM -aP -aP -ba -aP -aW -aP -aP -bM -bq -bM -aP -aP -aP -aP -aP -cv -aP -cS -dh -dL -dL -eM -cS -fv -fU -gi -gv -gt -gt -hl -gi -hV -ic -iv -iN -ic -ic -jB -gi -kb -kb -mb -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -ak -aB -aM -aP -aZ -aP -aV -aW -aP -aP -aM -bq -aM -aP -aR -aV -aV -aP -cF -aP -cS -cS -cS -cS -eN -cS -fv -fo -gi -gw -gN -gt -hm -gi -hW -iw -iB -iO -jg -jr -ic -gi -kc -ko -kz -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -an -an -ak -ak -aM -aP -aP -aR -aP -bu -aP -aP -bK -bq -bK -aP -aP -aP -aP -aP -aP -bf -cS -di -dM -ej -eO -cS -fv -fo -gi -gx -gt -gt -hn -gi -hX -ic -iC -iP -jh -jr -ic -gi -kd -gi -kd -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(70,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -am -an -ak -ak -aB -aM -aP -aP -aP -be -aP -aP -aP -bL -bT -ca -aP -aP -aP -be -aP -aR -aP -cS -dj -dN -ek -eP -cS -fv -fo -gi -gy -gt -ha -gD -gi -hX -ic -iC -iQ -ji -jr -ic -gi -ke -gi -ke -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(71,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -an -ak -ak -aB -ak -aM -aP -aP -aP -aP -aV -aW -ba -bM -bU -bM -ci -aP -aW -ci -aP -aP -aP -cS -dk -dN -dp -dp -cS -fv -fo -gi -gz -gt -gt -gz -gi -hY -ic -iC -iR -jj -jr -ic -gi -gi -gi -gi -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ay -aC -ay -aM -aR -aP -ba -aR -aP -aP -aP -aM -bq -aM -aP -aP -aP -aP -aP -aP -aP -cS -dl -dO -el -dp -cS -fv -fo -gi -gA -gt -gt -ho -gi -hZ -ic -iD -iS -jk -jr -ic -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(73,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ao -ak -ak -ay -aG -aM -aS -aP -aP -aP -aV -aP -aP -bK -bq -bK -aP -aP -ch -aP -ch -ch -aP -cS -dm -dN -em -dp -cS -fv -fU -gi -gv -gt -gN -gD -gi -ia -ic -ic -iN -ic -ic -jB -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(74,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ap -ak -az -ak -aH -aM -aS -aP -aP -aP -bv -aP -aP -bL -bV -ca -aP -aP -aP -aP -cy -aP -aP -cS -dn -dN -en -dp -cS -fv -fo -gi -gB -gt -gt -hp -gi -ib -ic -ic -iT -iv -ic -jC -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(75,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -aq -ak -ak -ak -aI -aM -aQ -ba -aP -be -aP -bD -aP -bM -bq -bM -aP -aV -aP -be -bJ -aP -cK -cS -do -dP -en -eQ -cS -fv -fo -gi -gC -gt -gN -gA -gi -ib -ic -iE -iN -ic -ic -ic -gi -ad -ad -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(76,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ar -ak -ak -aC -aH -aM -aP -aP -aP -aP -bw -aP -aP -aM -bq -aM -aR -aP -aR -aP -aP -cG -cL -cS -dp -dQ -eo -eR -cS -fv -fo -gi -gD -gt -gt -gy -gi -ic -ic -ic -iU -iv -ic -jD -gi -ad -ad -fJ -gI -gI -kH -gI -kO -kH -gI -kO -ag -ag -ag -ag -ag -ag -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(77,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -ak -ak -aM -aP -aP -aR -aP -aP -bE -bI -bN -bW -cb -cj -ck -aP -aP -aW -aP -bv -cS -dq -dR -ep -eS -cS -fv -fo -gi -gE -gt -gt -hq -gi -ic -ix -iF -iV -jl -js -jE -gi -ad -ad -fJ -kC -kG -kI -kL -kP -kS -kU -kO -ag -ag -ag -ag -ag -ag -kW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(78,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -aD -aJ -aM -aM -aM -aM -aM -aM -aM -aM -aM -bX -aM -aM -aM -aM -aM -aM -aM -aM -cS -dr -dS -eq -eq -cS -fw -fV -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -jF -gi -kf -kf -fJ -fC -gI -fJ -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(79,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -as -au -aA -aE -aK -aN -aT -bb -bb -bm -bb -bF -bb -bb -bY -cc -bb -cl -bm -cw -cz -bb -bb -cT -ds -dT -er -er -er -fx -fW -gk -gF -er -hb -er -er -er -er -hb -er -er -jt -jG -jQ -kg -kp -kA -kD -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(80,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ah -ah -ah -ah -ah -aL -aM -aU -aU -aU -bn -bx -bx -bx -bx -bZ -bx -bx -bx -cn -bx -cA -bx -bx -cU -dt -dU -es -eT -fo -fy -fo -gl -gG -fo -fo -fo -fo -id -fo -iG -fo -fo -ju -jH -gl -kh -kq -kB -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(81,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -ag -aM -aM -aM -aM -bo -cx -aM -aM -aM -aM -aM -aM -aM -co -cx -aM -aM -aM -cV -du -cV -cV -cV -cV -fz -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -hd -hd -hd -hd -ki -kr -hd -kE -kE -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(82,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -at -at -ag -ag -aM -aO -aV -bj -bp -bz -bG -aW -aO -aM -cd -aP -bj -cp -bz -bG -aP -aO -cV -dv -dV -et -eU -cV -fA -fX -gm -gH -gO -hc -gH -hE -gH -gH -iH -iW -hd -jv -jv -jR -kj -ks -hd -gI -gI -kJ -kM -kQ -kT -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(83,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -at -ag -ag -av -ag -aM -aQ -bc -bk -bq -aU -bH -be -bO -aM -ce -be -bk -bq -aU -cB -be -bO -cV -dw -dx -eu -eV -cV -fB -fY -fJ -gI -gP -gI -gI -hF -gI -gI -gI -iX -hd -jv -jv -jv -jv -kt -hd -gJ -gI -kJ -kN -kR -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(84,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -ag -ag -aM -aP -bd -bj -br -bx -bG -aR -aP -aM -aP -aP -bj -cq -bx -bG -aP -cM -cV -dx -dx -ev -eW -cV -fC -fZ -fJ -gI -gQ -hd -hd -hG -hd -hd -hd -iY -hd -jw -jv -jv -jv -kt -hd -gI -gI -kJ -gI -hf -kF -fJ -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(85,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -at -ag -ag -ag -aM -aM -aM -aM -bs -aU -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dy -dx -ew -eX -cV -fC -fZ -fJ -gI -gR -hd -hr -hH -ie -hd -nm -iZ -jm -jx -jI -jS -jx -ku -hd -kE -kE -fJ -gI -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(86,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -ag -aM -aO -aP -bj -br -bA -bG -bJ -aO -aM -aO -ch -bj -cq -bx -bG -aP -aO -cV -dz -dx -dx -eY -cV -fD -fZ -fJ -gJ -gR -hd -hs -hH -if -hd -iJ -ja -jn -jv -jJ -jT -kk -jv -hd -gI -gI -kK -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(87,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -av -ag -ag -ag -aM -aQ -be -bk -bq -aU -bH -be -bP -aM -aQ -be -bk -bq -aU -bH -be -cN -cV -dz -dW -ex -eZ -cV -fC -fZ -fJ -gI -gR -hd -hr -hH -ig -hd -iI -jb -jn -jv -jK -jT -jv -jv -hd -kF -gI -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(88,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -aM -aV -bf -bj -br -bx -bG -aV -aW -aM -aP -aP -bj -cq -bx -bG -ch -aW -cV -dx -dX -dx -fa -cV -fC -fZ -fJ -gI -gR -hd -hr -hI -ig -hd -iK -iI -jn -jv -jL -jT -kl -jv -hd -gI -kF -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(89,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -aM -aM -aM -aM -bs -bB -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dx -dx -ey -fb -cV -fC -fZ -fJ -gI -gR -hd -ht -hH -ih -hd -iI -iI -jn -jv -jM -jT -jv -jv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(90,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -aM -aO -aP -bj -br -bx -bG -aP -aO -aM -aO -aP -bj -cq -bx -bG -aP -aO -cV -dx -dY -ez -fc -cV -fC -fZ -fJ -gI -gR -hd -hd -hJ -hd -hd -iI -iI -jn -jv -jL -jT -jv -jv -hd -gI -kF -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(91,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -aM -aQ -bg -bk -bq -aU -bH -be -bO -aM -aQ -be -bk -bq -aU -bH -be -bO -cV -dA -cV -cV -cV -cV -fD -fZ -fJ -gK -gR -hd -hu -hK -ii -hd -iL -iI -jn -jv -jN -jT -jv -jv -hd -gJ -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(92,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -aw -ag -aM -aR -aP -bj -br -bx -bG -aP -bQ -aM -cf -aP -bj -cq -bx -bG -aP -cO -cV -dB -dB -eA -fd -cV -fC -fZ -fJ -gI -gR -hd -hv -hL -hw -hd -iI -iI -jn -jv -jO -jU -jv -jv -hd -hy -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(93,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -aM -aM -aM -aM -bs -aU -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dC -dB -dB -fe -cV -fC -fZ -fJ -gI -gS -hd -hd -hM -hd -hd -hd -hd -hd -jw -jv -jv -jv -jv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(94,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -aw -ag -ag -ag -aM -aO -aP -bj -br -bx -bG -aV -aO -aM -aO -aP -bj -cq -bx -bG -aP -cP -cV -dD -dB -dB -ff -cV -fC -fZ -fJ -gI -gR -hd -hw -hw -hw -hw -hw -hw -hd -jv -jv -jv -jv -jv -hd -kF -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(95,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -ag -ag -ag -aM -aQ -bh -bl -bq -aU -bH -be -bO -aM -cg -be -bk -bq -aU -bH -be -cQ -cV -dE -dZ -dB -dB -cV -fE -fZ -fJ -gI -gR -hd -hw -hN -hN -hN -hw -jc -hd -jv -jv -jV -jV -jV -hd -kF -hy -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -ag -ag -aM -aW -aW -bj -bt -bC -bG -aW -aR -aM -ch -bf -bj -cr -bC -bG -aP -aV -cV -dF -ea -eB -fg -cV -fF -fZ -fJ -gJ -gR -hd -hx -hO -ij -iy -hw -jd -hd -jv -jv -jW -jN -jL -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(97,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -af -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -cV -cV -cV -cV -cV -cV -fG -fZ -fJ -gI -gR -hd -hw -hP -ik -iz -hw -hw -hd -jv -jv -jL -jv -jv -hd -gK -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(98,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -eC -fh -fp -fH -fZ -fJ -gI -gR -hd -hw -hQ -hQ -hQ -hw -hw -hd -jv -jv -jN -jv -kv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -kY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(99,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -eC -fi -fq -fI -ga -fJ -gI -gR -hd -hw -hw -hw -hw -hw -hw -jo -jv -jv -jv -km -kw -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(100,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cC -cH -cH -cH -cH -eb -cs -fj -cm -fJ -fJ -fJ -fJ -gT -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(101,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -ct -cs -cD -cs -cs -cs -cs -ec -cs -fk -cm -ad -ad -fJ -gI -gU -he -gI -gI -hy -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(102,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -fJ -gI -gV -hf -hy -gI -gI -gI -gI -gI -hf -gI -gI -gI -hy -gI -hf -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(103,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(104,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(105,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(106,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(107,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(108,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(109,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -ct -cs -cD -cs -cs -cs -cs -ec -cs -fk -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(110,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cE -cI -cI -cI -cI -ed -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(111,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(112,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cu -cu -cu -cu -cu -cu -cu -cu -cu -cu -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(113,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(114,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(115,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(116,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(117,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(122,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(123,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(124,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(125,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(126,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(127,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(128,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(129,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(130,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(131,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(132,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(133,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(134,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(136,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(137,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(139,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(140,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(141,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(142,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(143,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(144,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(145,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(146,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(147,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(148,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(149,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(150,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(151,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(152,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(153,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(154,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(155,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(156,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(157,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(158,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(159,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(160,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(161,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(162,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(163,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(164,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -cW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(165,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(166,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(167,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(168,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(169,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(170,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(171,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(172,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(173,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(174,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(175,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(188,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(189,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(190,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(191,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(192,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(193,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(194,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/maps/away/slavers/slavers_base_areas.dm b/maps/away/slavers/slavers_base_areas.dm deleted file mode 100644 index be7805597bb7..000000000000 --- a/maps/away/slavers/slavers_base_areas.dm +++ /dev/null @@ -1,42 +0,0 @@ -/area/slavers_base - icon = 'maps/away/slavers/icons/areas.dmi' - -/area/slavers_base/maint - name = "\improper Slavers Base Maintenance" - icon_state = "maint" - -/area/slavers_base/dorms - name = "\improper Slavers Dorms" - icon_state = "dorms" - -/area/slavers_base/secwing - name = "\improper Slavers Base Security Wing" - icon_state = "secwing" - -/area/slavers_base/mort - name = "\improper Slaves Mortuary" - icon_state = "mort" - -/area/slavers_base/cells - name = "\improper Slaves Cells" - icon_state = "cells" - -/area/slavers_base/hallway - name = "\improper Slavers Base Hallways" - icon_state = "hallway" - -/area/slavers_base/med - name = "\improper Slaves Medical Examination Room" - icon_state = "med" - -/area/slavers_base/demo - name = "\improper Slaves Demonstration room" - icon_state = "demo" - -/area/slavers_base/powatm - name = "\improper Slavers Base power and atmos room" - icon_state = "powatm" - -/area/slavers_base/hangar - name = "\improper Slavers Base Hangar" - icon_state = "hangar" \ No newline at end of file diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index ca832b8ff9ce..911447bf6122 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -204,7 +204,7 @@ /turf/floor, /area/smugglers/base) "aF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, @@ -367,7 +367,7 @@ /turf/floor, /area/smugglers/base) "aW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/smugglers/base) "aX" = ( @@ -607,7 +607,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bD" = ( @@ -661,7 +661,7 @@ /turf/floor, /area/smugglers/base) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bK" = ( @@ -777,8 +777,8 @@ /turf/wall, /area/smugglers/dorms) "cd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -788,7 +788,7 @@ /obj/structure/noticeboard{ default_pixel_y = 30 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/machinery/microwave{ pixel_y = 10 @@ -796,7 +796,7 @@ /turf/floor/tiled, /area/smugglers/dorms) "cf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/snack, /obj/random/snack, @@ -806,21 +806,21 @@ /turf/floor/tiled, /area/smugglers/dorms) "cg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/drinkbottle, /obj/random/drinkbottle, /turf/floor/tiled, /area/smugglers/dorms) "ch" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/arcade, /turf/floor/tiled, /area/smugglers/dorms) "ci" = ( /obj/structure/closet/crate/plastic/rations, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cj" = ( @@ -828,8 +828,8 @@ /turf/floor/plating/airless, /area/smugglers/dorms) "cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 8; @@ -839,12 +839,12 @@ /turf/floor/tiled, /area/smugglers/dorms) "cm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "co" = ( @@ -874,7 +874,7 @@ /area/smugglers/dorms) "cs" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper/smug_3, /obj/item/flame/fuelled/lighter, /obj/random/coin, @@ -882,7 +882,7 @@ /area/smugglers/dorms) "ct" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cash/c10, /obj/random/smokes, /obj/random/snack, @@ -897,7 +897,7 @@ /area/smugglers/dorms) "cv" = ( /obj/structure/closet, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /obj/random/medical, /obj/random/tech_supply, @@ -910,29 +910,29 @@ /area/smugglers/dorms) "cx" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cy" = ( /obj/structure/closet/smuggler, /obj/random/suit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cz" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/malf_drone, /turf/floor/tiled, /area/smugglers/dorms) "cA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/tiled, /area/smugglers/dorms) "cB" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cC" = ( diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 217009898388..a1670a3978c6 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -3,11 +3,11 @@ #include "../../../mods/content/xenobiology/_xenobiology.dme" /obj/abstract/submap_landmark/joinable_submap/unishi - name = "SRV Verne" + name = "SRV Verne" archetype = /decl/submap_archetype/derelict/unishi /decl/submap_archetype/derelict/unishi - descriptor = "derelict research vessel" + name = "derelict research vessel" crew_jobs = list( /datum/job/submap/unishi_crew, /datum/job/submap/unishi_researcher diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 81542eb7c1c2..87f0973c8886 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -15,7 +15,7 @@ /turf/floor/tiled/airless/broken, /area/yacht/bridge) "ae" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "af" = ( @@ -30,7 +30,7 @@ /turf/wall/titanium, /area/yacht/bridge) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/helm, /turf/floor/laminate/walnut, /area/yacht/bridge) @@ -43,8 +43,8 @@ "ak" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/structure/bed/chair/comfy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "al" = ( @@ -60,7 +60,7 @@ /obj/item/chems/drinks/glass2/coffeecup, /obj/item/newspaper, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/energy, /obj/item/paper{ info = "I used up all of my energy. I am hopelessly lost. This ship has become my grave. They did it. The intelligence agency that no one ever talks about. Sol Gov wanted their revenge, and they got it. They easily could have killed me on my ship, or tortured me, but they knew that floating here through space would be the worst possible torture. " @@ -70,19 +70,19 @@ "an" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/giant_spider/hunter, /turf/floor/laminate/walnut, /area/yacht/bridge) "ao" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/maintenance/clean, /turf/floor/laminate/walnut, /area/yacht/bridge) "ap" = ( /obj/structure/filing_cabinet/chestdrawer, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "aq" = ( @@ -94,7 +94,7 @@ /obj/item/rig/medical/equipped, /obj/item/gun/energy/captain, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "ar" = ( @@ -102,7 +102,7 @@ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "as" = ( @@ -111,7 +111,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "at" = ( @@ -122,7 +122,7 @@ name = "Yacht bridge"; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "au" = ( @@ -131,7 +131,7 @@ icon_state = "tube1" }, /obj/structure/reagent_dispensers/water_cooler, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/yacht/bridge) "av" = ( @@ -179,7 +179,7 @@ /obj/structure/hygiene/shower{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aE" = ( @@ -188,14 +188,14 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aF" = ( /obj/structure/bed/chair/wood/wings{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aG" = ( @@ -205,7 +205,7 @@ /obj/structure/table/marble, /obj/item/trash/snack_bowl, /obj/machinery/reagentgrinder/juicer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "Tonight I woke up to a sound I hoped to have never heard, a small explosion. I rushed to the bridge to diagnose the damage and saw the worst possible news. My solar tracker is gone, and so is the fucking computer. No way to override the settings now, because the assholes EMPd the computer. No way to charge my SMES reliably, and no way to heat the fuel. I am stuck in the water! Unheated, this gas will not be enough to get absolutely anywhere near a port. This is bad. Real bad. The current charge on SMES is 20 percent, so I'll just try and orient the ship to hit the current star at maximum efficiency so we will charge at 100, and maybe make it to the next solar system. The next port is in the orbit of a Gas giant named Duma. Maybe I can dock there and repair my array. I freaking knew I needed to get a generator. I spent all of the money the Terrans gave me, and this piece of shit is all I could get. " }, @@ -220,14 +220,14 @@ /area/yacht/living) "aI" = ( /obj/item/towel/random, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aJ" = ( /obj/structure/hygiene/toilet{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aK" = ( @@ -239,22 +239,22 @@ /obj/machinery/light{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aM" = ( /obj/structure/table/marble, /obj/item/pizzabox/vegetable, /obj/item/chems/glass/rag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/junk, /turf/floor/laminate/yew, /area/yacht/living) @@ -270,18 +270,18 @@ /obj/structure/table/marble, /obj/item/deck/cards, /obj/item/dice, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aR" = ( /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aS" = ( /obj/structure/table/marble, /obj/machinery/microwave, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aT" = ( @@ -327,7 +327,7 @@ }, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aY" = ( @@ -337,7 +337,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "aZ" = ( @@ -350,7 +350,7 @@ /obj/structure/table/marble, /obj/item/book/manual/chef_recipes, /obj/item/chems/drinks/pitcher, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/drinkbottle, /turf/floor/laminate/yew, /area/yacht/living) @@ -360,7 +360,7 @@ }, /obj/effect/decal/cleanable/blood/gibs/robot/down, /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bb" = ( @@ -369,7 +369,7 @@ icon_state = "tube1" }, /obj/machinery/vending/dinnerware, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bc" = ( @@ -384,12 +384,12 @@ /area/yacht/living) "bf" = ( /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bg" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bh" = ( @@ -399,7 +399,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bk" = ( @@ -419,7 +419,7 @@ /area/yacht/living) "bn" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bo" = ( @@ -427,7 +427,7 @@ /turf/floor/tiled/freezer, /area/yacht/living) "bp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "I have accepted my fate. I will go into EVA with one of the cyanide pills in my mouth, and I will float off. I want a military funeral, and I will arrange it myself. Good bye all. I have earned and sealed my fate. " }, @@ -454,7 +454,7 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bu" = ( @@ -478,7 +478,7 @@ /turf/floor/rock/sand/water, /area/yacht/living) "bz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bA" = ( @@ -492,7 +492,7 @@ dir = 8 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bB" = ( @@ -503,7 +503,7 @@ dir = 4 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bC" = ( @@ -556,7 +556,7 @@ "bI" = ( /obj/machinery/light, /obj/item/clothing/shoes/swimmingfins, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bJ" = ( @@ -566,12 +566,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bK" = ( /obj/effect/decal/cleanable/blood/gibs/robot/down, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/floodlight, /turf/floor/laminate/yew, /area/yacht/living) @@ -609,24 +609,24 @@ /area/yacht/engine) "bR" = ( /obj/machinery/atmospherics/unary/tank/air, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bS" = ( /obj/structure/tank_rack/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bT" = ( /obj/item/cell/hyper, /obj/item/book/manual/engineering_guide, /obj/item/rcd, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/engines, /turf/floor/plating, /area/yacht/engine) "bU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable, /obj/structure/cable{ icon_state = "0-4" @@ -645,40 +645,40 @@ name = "Yacht engine"; pixel_y = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bW" = ( /obj/item/chems/spray/extinguisher, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bX" = ( /obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bY" = ( /obj/machinery/seed_storage/garden, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "bZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/supply, /turf/floor/plating, /area/yacht/engine) "ca" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cb" = ( /obj/machinery/atmospherics/binary/pump, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cc" = ( @@ -691,14 +691,14 @@ /area/yacht/engine) "cd" = ( /obj/structure/closet/crate/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "ce" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/broken, /turf/floor/plating, /area/yacht/engine) @@ -728,7 +728,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cj" = ( @@ -739,19 +739,19 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "ck" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cl" = ( /obj/structure/janitorialcart, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cm" = ( @@ -762,21 +762,21 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "co" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/pump, /turf/floor/plating, /area/yacht/engine) @@ -843,7 +843,7 @@ /turf/floor/plating/airless, /area/yacht/engine) "cu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -857,22 +857,22 @@ pixel_x = -24 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cE" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cF" = ( /obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cG" = ( @@ -880,7 +880,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cJ" = ( @@ -904,12 +904,12 @@ /area/yacht/engine) "cN" = ( /obj/structure/closet/toolcloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cQ" = ( @@ -921,7 +921,7 @@ pixel_x = -23 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cR" = ( @@ -931,32 +931,32 @@ }, /obj/item/tool/spade, /obj/item/chems/glass/bucket, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cS" = ( /obj/machinery/light, /obj/structure/reagent_dispensers/beerkeg, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cW" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "cY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cZ" = ( @@ -966,7 +966,7 @@ "da" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/item/caution/cone, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "db" = ( @@ -975,12 +975,12 @@ /area/yacht/engine) "dc" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "dd" = ( /obj/structure/closet/wardrobe/suit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) "df" = ( @@ -989,7 +989,7 @@ /area/yacht/engine) "dg" = ( /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dh" = ( @@ -997,7 +997,7 @@ dir = 1; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "di" = ( @@ -1010,11 +1010,11 @@ /area/yacht/engine) "dk" = ( /obj/machinery/atmospherics/unary/heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; level = 2 @@ -1025,7 +1025,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "do" = ( @@ -1034,7 +1034,7 @@ dir = 4; pixel_y = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /turf/floor/plating, /area/yacht/engine) @@ -1080,7 +1080,7 @@ /area/yacht/engine) "dt" = ( /obj/machinery/atmospherics/pipe/manifold4w/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /obj/machinery/light/small{ dir = 8 @@ -1088,7 +1088,7 @@ /turf/floor/plating, /area/yacht/engine) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 10 }, @@ -1096,21 +1096,21 @@ /area/yacht/engine) "dv" = ( /obj/machinery/atmospherics/pipe/simple/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dw" = ( /obj/machinery/atmospherics/unary/heater{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dx" = ( /turf/floor/reinforced/carbon_dioxide, /area/yacht/engine) "dy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black, /turf/floor/plating, /area/yacht/engine) @@ -1119,7 +1119,7 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dA" = ( @@ -1127,7 +1127,7 @@ dir = 10 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/recharge_station, /turf/floor/plating, /area/yacht/engine) @@ -1188,7 +1188,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/constructable_frame/computerframe, /obj/machinery/button/access/interior{ id_tag = "yacht_airlock"; @@ -1205,7 +1205,7 @@ icon_state = "0-2" }, /obj/item/toolbox/electrical, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1218,7 +1218,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, @@ -1228,7 +1228,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external/bolted{ id_tag = "yacht_outer" }, @@ -1238,7 +1238,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "yacht_airlock"; pixel_y = 24; @@ -1262,7 +1262,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1278,7 +1278,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, @@ -1288,7 +1288,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump{ dir = 8 }, @@ -1298,8 +1298,8 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -1311,7 +1311,7 @@ dir = 8; pixel_x = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -1324,7 +1324,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "rb" = ( @@ -1334,7 +1334,7 @@ /turf/floor/plating, /area/yacht/engine) "sb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -1342,7 +1342,7 @@ /area/yacht/engine) "tb" = ( /obj/structure/closet/firecloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -1350,14 +1350,14 @@ /area/yacht/engine) "ub" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "vb" = ( /obj/machinery/atmospherics/portables_connector{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/plating, /area/yacht/engine) @@ -1369,7 +1369,7 @@ pixel_y = 20 }, /obj/item/bikehorn/rubberducky, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/soap, /turf/floor/tiled/freezer, /area/yacht/living) @@ -1378,7 +1378,7 @@ /area/yacht/living) "Hj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1386,8 +1386,8 @@ /area/yacht/engine) "Ty" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/yew, /area/yacht/living) diff --git a/maps/away_sites_testing/away_sites_testing.dm b/maps/away_sites_testing/away_sites_testing.dm index 3f324d268ea5..ab5e2b12a3df 100644 --- a/maps/away_sites_testing/away_sites_testing.dm +++ b/maps/away_sites_testing/away_sites_testing.dm @@ -17,7 +17,6 @@ #include "../away/mining/mining.dm" #include "../away/mobius_rift/mobius_rift.dm" #include "../away/smugglers/smugglers.dm" - #include "../away/slavers/slavers_base.dm" #include "../away/unishi/unishi.dm" #include "../away/yacht/yacht.dm" #include "../away/liberia/liberia.dm" diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index baed72f3aaea..df58cbab4de9 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -2424,7 +2424,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/central) "gJ" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "gK" = ( diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index ae068ece7af6..2490837e9935 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -200,7 +200,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/range) "aaD" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/floor/tiled/steel_grid, /area/exodus/security/range) @@ -344,11 +344,11 @@ /area/exodus/security/range) "aaV" = ( /obj/structure/closet/crate, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, /obj/machinery/light, /turf/floor/tiled/steel_grid, /area/exodus/security/range) @@ -63651,7 +63651,7 @@ /obj/machinery/conveyor_switch{ id_tag = "cargo_mining_conveyor" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) @@ -64224,7 +64224,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/starboard) "nIv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -65001,7 +65001,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_two) "xpO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 6c13c0ddb9ce..9372a9368a76 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,7 +1,6 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" @@ -26,6 +25,9 @@ // Must come after borers for compatibility. #include "../../mods/content/psionics/_psionics.dme" + // Must come after psionics for counsellor compatibility. + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" @@ -47,34 +49,16 @@ #include "../away/mining/mining.dm" #include "../away/mobius_rift/mobius_rift.dm" #include "../away/smugglers/smugglers.dm" - #include "../away/slavers/slavers_base.dm" #include "../away/unishi/unishi.dm" #include "../away/yacht/yacht.dm" - #include "jobs/_goals.dm" - #include "jobs/captain.dm" - #include "jobs/civilian.dm" - #include "jobs/engineering.dm" - #include "jobs/medical.dm" - #include "jobs/science.dm" - #include "jobs/security.dm" - #include "jobs/synthetics.dm" - - #include "outfits/_pda.dm" - #include "outfits/cargo.dm" - #include "outfits/civilian.dm" - #include "outfits/command.dm" - #include "outfits/engineering.dm" - #include "outfits/medical.dm" - #include "outfits/science.dm" - #include "outfits/security.dm" + #include "exodus_goals.dm" #include "exodus_announcements.dm" #include "exodus_antagonism.dm" #include "exodus_cameras.dm" #include "exodus_areas.dm" #include "exodus_elevator.dm" - #include "exodus_departments.dm" #include "exodus_jobs.dm" #include "exodus_loadout.dm" #include "exodus_overmap.dm" diff --git a/maps/exodus/exodus_antagonism.dm b/maps/exodus/exodus_antagonism.dm index 92660ef36082..322bebbf1d34 100644 --- a/maps/exodus/exodus_antagonism.dm +++ b/maps/exodus/exodus_antagonism.dm @@ -3,15 +3,6 @@ LAZYINITLIST(protected_jobs) protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/lawyer, /datum/job/hos) -/decl/special_role/godcultist/Initialize() - . = ..() - LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/captain, /datum/job/hos) - LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective) - LAZYINITLIST(blacklisted_jobs) - blacklisted_jobs |= /datum/job/chaplain - /decl/special_role/cultist/Initialize() . = ..() LAZYINITLIST(restricted_jobs) diff --git a/maps/exodus/exodus_departments.dm b/maps/exodus/exodus_departments.dm deleted file mode 100644 index 3a76c9b958ff..000000000000 --- a/maps/exodus/exodus_departments.dm +++ /dev/null @@ -1,98 +0,0 @@ -/decl/department/engineering - name = "Engineering" - announce_channel = "Engineering" - colour = "#ffa500" - display_priority = 4 - display_color = "#fff5cc" - -/obj/item/robot_module/engineering - associated_department = /decl/department/engineering - -/obj/machinery/network/pager/engineering - department = /decl/department/engineering - -/decl/department/security - name = "Security" - announce_channel = "Security" - colour = "#dd0000" - display_priority = 3 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - announce_channel = "Medical" - colour = "#008000" - display_priority = 2 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - announce_channel = "Science" - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - -/decl/department/service - name = "Service" - announce_channel = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/supply - name = "Supply" - announce_channel = "Supply" - colour = "#bb9040" - display_color = "#f0e68c" - -/obj/machinery/network/pager/cargo - department = /decl/department/supply - -/decl/department/support - name = "Support" - announce_channel = "Command" - colour = "#800080" - display_color = "#87ceeb" - -/decl/department/exploration - name = "Exploration" - announce_channel = "Exploration" - colour = "#68099e" - display_color = "#b784a7" diff --git a/maps/exodus/jobs/_goals.dm b/maps/exodus/exodus_goals.dm similarity index 100% rename from maps/exodus/jobs/_goals.dm rename to maps/exodus/exodus_goals.dm diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 432d3455d219..3d1601530d6b 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -1,26 +1,15 @@ -/datum/job/ministation/assistant +/datum/job/assistant/ministation title = "Recruit" - total_positions = -1 - spawn_positions = -1 supervisors = "absolutely everyone" - economic_power = 1 - access = list() - minimal_access = list() - hud_icon = "hudassistant" alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/outfit/job/ministation_assistant - department_types = list(/decl/department/civilian) event_categories = list(ASSIGNMENT_GARDENER) - -/datum/job/ministation/assistant/get_access() - if(get_config_value(/decl/config/toggle/assistant_maint)) - return list(access_maint_tunnels) - return list() + hud_icon = "hudassistant" /decl/outfit/job/ministation_assistant name = "Job - Ministation Assistant" -/datum/job/ministation/bartender +/datum/job/bartender/ministation title = "Bartender" alt_titles = list("Cook","Barista") supervisors = "the Lieutenant and the Captain" @@ -30,16 +19,6 @@ department_types = list(/decl/department/service) selection_color = "#3fbe4a" economic_power = 5 - access = list( - access_hydroponics, - access_bar, - access_kitchen - ) - minimal_access = list( - access_hydroponics, - access_bar, - access_kitchen - ) min_skill = list( SKILL_COOKING = SKILL_ADEPT, SKILL_BOTANY = SKILL_BASIC, @@ -51,14 +30,13 @@ ) skill_points = 30 -/datum/job/ministation/cargo +/datum/job/cargo_tech/ministation title = "Cargo Technician" alt_titles = list("Shaft Miner","Drill Technician","Prospector") supervisors = "the Lieutenant and the Captain" total_positions = 3 spawn_positions = 1 outfit_type = /decl/outfit/job/ministation/cargo - department_types = list(/decl/department/service) selection_color = "#8a7c00" economic_power = 5 access = list( @@ -94,57 +72,24 @@ SKILL_FINANCE = SKILL_MAX ) skill_points = 30 - software_on_spawn = list( - /datum/computer_file/program/supply, - /datum/computer_file/program/deck_management, - /datum/computer_file/program/reports - ) -/datum/job/ministation/janitor - title = "Janitor" - event_categories = list(ASSIGNMENT_JANITOR) - department_types = list(/decl/department/service) +/datum/job/janitor/ministation total_positions = 2 - spawn_positions = 1 supervisors = "the Lieutenant and the Captain" economic_power = 3 selection_color = "#940088" - access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - minimal_access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - alt_titles = list( - "Custodian", - "Sanitation Technician" - ) outfit_type = /decl/outfit/job/ministation/janitor min_skill = list( SKILL_HAULING = SKILL_BASIC ) skill_points = 28 -/datum/job/ministation/librarian - title = "Librarian" - department_types = list(/decl/department/service) - total_positions = 1 +/datum/job/librarian/ministation spawn_positions = 2 supervisors = "the Lieutenant, the Captain, and the smell of old paper" economic_power = 5 selection_color = "#008800" access = list(access_library) - minimal_access = list(access_library) alt_titles = list( "Curator", "Archivist" diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 7424f7724a5c..a823a716095c 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,5 +1,4 @@ -/datum/job/ministation/captain - title = "Captain" +/datum/job/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain min_skill = list( @@ -13,30 +12,12 @@ SKILL_WEAPONS = SKILL_MAX ) skill_points = 40 - head_position = 1 - department_types = list(/decl/department/command) - total_positions = 1 - spawn_positions = 1 - selection_color = "#1d1d4f" - hud_icon = "hudcaptain" - req_admin_notify = 1 - access = list() - minimal_access = list() - minimal_player_age = 14 - economic_power = 20 - ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 -/datum/job/ministation/captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/captain/ministation/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/freetradeunion_rename_company -/datum/job/ministation/captain/get_access() - return get_all_station_access() - /mob/proc/freetradeunion_rename_company() set name = "Defect from Tradehouse" set category = "Captain's Powers" @@ -52,113 +33,10 @@ command_announcement.Announce("Congratulations to all members of [capitalize(global.using_map.company_name)] on the new name. Their rebranding has changed the [global.using_map.company_short] market value by [0.01*rand(-10,10)]%.", "Trade Union Name Change") verbs -= /mob/proc/freetradeunion_rename_company -/datum/job/ministation/hop +/datum/job/hop/ministation title = "Lieutenant" - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/hop - head_position = 1 - department_types = list( - /decl/department/command, - /decl/department/civilian - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#2f2f7f" hud_icon = "hudlieutenant" - req_admin_notify = 1 - minimal_player_age = 14 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - not_random_selectable = 1 - access = list( - access_security, - access_sec_doors, - access_brig, - access_forensics_lockers, - access_armory, - access_heads, - access_medical, - access_engine, - access_atmospherics, - access_change_ids, - access_ai_upload, - access_eva, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_morgue, - access_crematorium, - access_kitchen, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_cargo, - access_cargo_bot, - access_mailsorting, - access_qm, - access_hydroponics, - access_lawyer, - access_chapel_office, - access_library, - access_research, - access_mining, - access_heads_vault, - access_mining_station, - access_hop, - access_RC_announce, - access_keycard_auth, - access_gateway, - access_cameras - ) - minimal_access = list( - access_security, - access_sec_doors, - access_brig, - access_forensics_lockers, - access_armory, - access_heads, - access_medical, - access_engine, - access_atmospherics, - access_change_ids, - access_ai_upload, - access_eva, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_morgue, - access_crematorium, - access_kitchen, - access_cargo, - access_cargo_bot, - access_mailsorting, - access_qm, - access_hydroponics, - access_lawyer, - access_chapel_office, - access_library, - access_research, - access_mining, - access_heads_vault, - access_mining_station, - access_hop, - access_RC_announce, - access_keycard_auth, - access_gateway, - access_cameras - ) min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_BASIC, diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index b3d12fd6afa5..d780f2353d28 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -1,12 +1,9 @@ -/datum/job/ministation/engineer +/datum/job/engineer/ministation title = "Station Engineer" supervisors = "the Head Engineer" total_positions = 2 spawn_positions = 2 outfit_type = /decl/outfit/job/ministation/engineer - department_types = list(/decl/department/engineering) - selection_color = "#5b4d20" - economic_power = 5 minimal_player_age = 3 access = list( access_eva, @@ -32,41 +29,11 @@ access_emergency_storage, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) skill_points = 30 alt_titles = list("Atmospheric Technician", "Electrician", "Maintenance Technician") - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/ministation/engineer/head +/datum/job/chief_engineer/ministation title = "Head Engineer" - head_position = 1 - department_types = list( - /decl/department/engineering, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#7f6e2c" - req_admin_notify = 1 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 hud_icon = "hudchiefengineer" access = list( access_engine, @@ -116,24 +83,6 @@ access_ai_upload, access_cameras ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/chief_engineer - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_ADEPT, - SKILL_EVA = SKILL_ADEPT, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_ADEPT, - SKILL_ATMOS = SKILL_ADEPT, - SKILL_ENGINES = SKILL_EXPERT - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) skill_points = 40 alt_titles = list("Chief of Engineering") - event_categories = list(ASSIGNMENT_ENGINEER) \ No newline at end of file diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index 00c298a4c01d..0e91a2d945b4 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -1,7 +1,5 @@ -/datum/job/ministation/doctor +/datum/job/doctor/ministation title = "Medical Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor" total_positions = 2 spawn_positions = 2 @@ -18,8 +16,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -38,28 +34,13 @@ access_cameras ) outfit_type = /decl/outfit/job/ministation/doctor - minimal_player_age = 3 - event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/ministation/doctor/head +/datum/job/cmo/ministation title = "Head Doctor" - head_position = 1 - department_types = list( - /decl/department/medical, - /decl/department/command - ) supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/ministation/doctor/head alt_titles = list("Chief Medical Officer", "Head Surgeon") - total_positions = 1 - spawn_positions = 1 skill_points = 38 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - selection_color = "#026865" - req_admin_notify = 1 - economic_power = 10 hud_icon = "hudheaddoctor" access = list( access_medical, @@ -113,6 +94,3 @@ access_external_airlocks, access_cameras ) - minimal_player_age = 14 - ideal_character_age = 50 - event_categories = list(ASSIGNMENT_MEDICAL) \ No newline at end of file diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index f9bcb575468d..f2d80cbe65f1 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -1,49 +1,15 @@ -/datum/job/ministation/scientist +/datum/job/scientist/ministation title = "Researcher" alt_titles = list("Scientist","Xenobiologist","Roboticist","Xenobotanist") supervisors = "the Head Researcher" spawn_positions = 1 total_positions = 2 - department_types = list(/decl/department/science) outfit_type = /decl/outfit/job/ministation/scientist hud_icon = "hudscientist" - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) skill_points = 34 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - selection_color = "#633d63" - economic_power = 7 - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/ministation/scientist/head +/datum/job/rd/ministation title = "Research Director" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list("Head Researcher", "Chief Researcher") outfit_type = /decl/outfit/job/ministation/scientist/head min_skill = list( @@ -61,14 +27,6 @@ SKILL_SCIENCE = SKILL_MAX ) skill_points = 40 - head_position = 1 - department_types = list( - /decl/department/science, - /decl/department/command - ) - selection_color = "#ad6bad" - req_admin_notify = 1 - economic_power = 15 hud_icon = "hudheadscientist" access = list( access_rd, @@ -124,10 +82,3 @@ access_network, access_cameras ) - minimal_player_age = 14 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - event_categories = list(ASSIGNMENT_SCIENTIST) - diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index ac68182cff2b..55ea8e841e2f 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -1,14 +1,10 @@ -/datum/job/ministation/security +/datum/job/officer/ministation title = "Security Officer" alt_titles = list("Warden") - supervisors = "the Head of Security" spawn_positions = 1 total_positions = 2 outfit_type = /decl/outfit/job/ministation/security - department_types = list(/decl/department/security) - selection_color = "#990000" economic_power = 7 - minimal_player_age = 7 access = list( access_security, access_brig, @@ -24,28 +20,14 @@ access_brig, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_BASIC, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_COMBAT = SKILL_BASIC, - SKILL_WEAPONS = SKILL_BASIC - ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) skill_points = 30 - event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/ministation/detective - title = "Detective" +/datum/job/detective/ministation alt_titles = list("Inspector") supervisors = "Justice... and the Trademaster" spawn_positions = 1 total_positions = 1 outfit_type = /decl/outfit/job/ministation/detective - department_types = list(/decl/department/security) - selection_color = "#630000" economic_power = 7 minimal_player_age = 3 access = list( @@ -71,31 +53,10 @@ SKILL_WEAPONS = SKILL_BASIC, SKILL_FORENSICS = SKILL_ADEPT ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX, - SKILL_FORENSICS = SKILL_MAX - ) skill_points = 34 -/datum/job/ministation/security/head - title = "Head of Security" - supervisors = "the Captain" +/datum/job/hos/ministation outfit_type = /decl/outfit/job/ministation/security/head - head_position = 1 - department_types = list( - /decl/department/security, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#9d2300" - req_admin_notify = 1 - minimal_player_age = 14 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - not_random_selectable = 1 hud_icon = "hudhos" access = list( access_security, @@ -139,9 +100,5 @@ SKILL_COMBAT = SKILL_ADEPT, SKILL_WEAPONS = SKILL_ADEPT ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) skill_points = 40 alt_titles = list("Security Commander") diff --git a/maps/ministation/jobs/synthetics.dm b/maps/ministation/jobs/synthetics.dm deleted file mode 100644 index 1aea5738c902..000000000000 --- a/maps/ministation/jobs/synthetics.dm +++ /dev/null @@ -1,79 +0,0 @@ -/datum/job/ministation/robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws, the Lieutenant, and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/ministation/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/ministation/robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/ministation/robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title - -/datum/job/computer - title = "Computer" - event_categories = list(ASSIGNMENT_COMPUTER) - total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm - spawn_positions = 1 - selection_color = "#3f823f" - supervisors = "your laws" - req_admin_notify = 1 - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - outfit_type = /decl/outfit/job/silicon/ai - loadout_allowed = FALSE - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/computer/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/computer/is_position_available() - return (empty_playable_ai_cores.len != 0) - -/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) - return H - -/datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) - character = character.AIize(move = FALSE) - - // is_available for AI checks that there is an empty core available in this list - var/obj/structure/aicore/deactivated/C = empty_playable_ai_cores[1] - empty_playable_ai_cores -= C - - character.forceMove(C.loc) - var/mob/living/silicon/ai/A = character - A.on_mob_init() - - if(latejoin) - new_player_mob.AnnounceCyborg(character, title, "has been downloaded to the empty core in \the [get_area_name(src)]") - SSticker.mode.handle_latejoin(character) - - qdel(C) - return TRUE diff --git a/maps/ministation/jobs/tradehouse.dm b/maps/ministation/jobs/tradehouse.dm index ed057b4fb202..1e167615cf89 100644 --- a/maps/ministation/jobs/tradehouse.dm +++ b/maps/ministation/jobs/tradehouse.dm @@ -1,4 +1,4 @@ -/datum/job/ministation/tradehouse/rep +/datum/job/tradehouse_rep title = "Tradehouse Representative" alt_titles = list("Narc") hud_icon = "hudnarc" diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 5e3a75b879eb..88dfa842c039 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -422,7 +422,7 @@ /turf/floor/tiled, /area/ministation/cargo) "cd" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /turf/floor/plating/airless, /area/space) "ce" = ( @@ -455,7 +455,7 @@ /turf/floor/plating/airless, /area/space) "cl" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/loading{ dir = 8 }, @@ -469,7 +469,7 @@ /turf/floor/plating/airless, /area/space) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-4" }, @@ -815,7 +815,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "dF" = ( @@ -944,7 +944,7 @@ /turf/floor/tiled, /area/ministation/janitor) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "ek" = ( @@ -1103,7 +1103,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/junction, /obj/structure/cable{ icon_state = "2-8" @@ -1267,7 +1267,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -1319,7 +1319,7 @@ /turf/floor/plating, /area/ministation/engine) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/hologram/holopad, /obj/item/radio/intercom/locked{ dir = 4; @@ -1506,7 +1506,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "fW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -1592,7 +1592,7 @@ /turf/floor/tiled, /area/ministation/cargo) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -1601,7 +1601,7 @@ /area/ministation/cargo) "gl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1903,7 +1903,7 @@ /turf/floor/tiled, /area/ministation/cargo) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1936,7 +1936,7 @@ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -2059,7 +2059,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2229,7 +2229,7 @@ /area/ministation/dorms) "iU" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 8 @@ -2569,7 +2569,7 @@ /turf/floor/tiled/techfloor, /area/ministation/atmospherics) "kw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2634,7 +2634,7 @@ /obj/structure/window/reinforced/tinted{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -2747,7 +2747,7 @@ /turf/floor/tiled, /area/ministation/hall/n) "ln" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /turf/floor/tiled, /area/ministation/engine) @@ -2767,7 +2767,7 @@ /turf/floor/tiled, /area/ministation/cargo) "lr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -3183,7 +3183,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /obj/structure/window/reinforced/tinted{ dir = 8 @@ -3718,7 +3718,7 @@ /turf/floor/laminate/walnut, /area/ministation/dorms) "qo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4268,8 +4268,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/shiny/mapped/aluminium/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, @@ -4755,7 +4755,7 @@ /turf/floor/tiled/monotile, /area/ministation/atmospherics) "va" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stock_parts/circuitboard/airlock_electronics, /obj/item/stock_parts/circuitboard/airlock_electronics, @@ -4861,7 +4861,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "vz" = ( @@ -4926,7 +4926,7 @@ /area/ministation/engine) "vK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair/wood{ dir = 8 }, @@ -5060,7 +5060,7 @@ /turf/floor/plating, /area/ministation/maint/l1ne) "wt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/ministation/engine) "wu" = ( @@ -5252,7 +5252,7 @@ /turf/floor/plating, /area/ministation/maint/l1central) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/department/eva{ pixel_y = 30 }, @@ -5275,7 +5275,7 @@ /turf/floor/plating, /area/ministation/maint/westatmos) "xE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, @@ -6722,7 +6722,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -7037,7 +7037,7 @@ /turf/floor/tiled, /area/ministation/hall/s1) "Eg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, @@ -7095,7 +7095,7 @@ /turf/floor/tiled, /area/ministation/engine) "En" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Eo" = ( @@ -7243,7 +7243,7 @@ /area/ministation/engine) "EK" = ( /obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -7343,7 +7343,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" @@ -7432,7 +7432,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/opossum/poppy, /obj/item/stool/padded, /obj/abstract/landmark/start{ @@ -7491,7 +7491,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate, /area/ministation/engine) "Fn" = ( @@ -7935,7 +7935,7 @@ /area/ministation/trash) "Ge" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -8088,7 +8088,7 @@ /area/ministation/engine) "Gy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Gz" = ( @@ -8339,7 +8339,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hd" = ( @@ -8383,7 +8383,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hj" = ( @@ -8511,7 +8511,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1 }, @@ -8526,7 +8526,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-4" }, @@ -8567,7 +8567,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "HD" = ( @@ -8632,7 +8632,7 @@ /obj/structure/table, /obj/item/folder/yellow, /obj/item/clothing/head/earmuffs, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/cash/scavbucks, /turf/floor/tiled, /area/ministation/engine) @@ -8848,7 +8848,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "Iq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -10506,7 +10506,7 @@ pixel_x = -32; pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, @@ -11145,7 +11145,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "OY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n) @@ -11185,7 +11185,7 @@ /turf/floor/plating, /area/ministation/ai_upload) "Pe" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -11246,7 +11246,7 @@ /turf/space, /area/ministation/supply_dock) "Pq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/megaphone, /obj/item/box, @@ -11561,7 +11561,7 @@ /area/ministation/smcontrol) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "QH" = ( @@ -11776,7 +11776,7 @@ /turf/floor/plating/airless, /area/ministation/mining) "Rr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Rs" = ( @@ -11790,7 +11790,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Ru" = ( @@ -12020,7 +12020,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -12039,7 +12039,7 @@ /area/ministation/atmospherics) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Sp" = ( @@ -12062,7 +12062,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "Ss" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12106,7 +12106,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 }, @@ -12197,7 +12197,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12497,7 +12497,7 @@ /turf/floor/tiled, /area/ministation/engine) "TP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -12609,7 +12609,7 @@ /turf/floor/tiled, /area/ministation/engine) "Ul" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -12745,7 +12745,7 @@ /turf/floor/tiled, /area/ministation/engine) "UT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 1 @@ -12927,7 +12927,7 @@ /turf/floor/plating, /area/ministation/supermatter) "VF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) @@ -13117,7 +13117,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "Wn" = ( @@ -13261,7 +13261,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -13274,7 +13274,7 @@ /turf/space, /area/space) "Xb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -13344,7 +13344,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -13384,7 +13384,7 @@ /turf/floor/plating, /area/ministation/mining) "Xx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Xz" = ( @@ -13581,7 +13581,7 @@ /turf/floor/plating, /area/ministation/engine) "Yu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -14017,7 +14017,7 @@ /area/ministation/engine) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 9aac14f4417d..5deccebb9314 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -242,7 +242,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/passive/mouse/brown/Tom, /turf/floor/lino, /area/ministation/cafe) @@ -329,7 +329,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 1 }, @@ -434,7 +434,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l2centrals) "cq" = ( @@ -611,7 +611,7 @@ /area/ministation/hall/w2) "dn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled/stone, /area/ministation/hall/e2) @@ -895,7 +895,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "ey" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -999,7 +999,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -1673,7 +1673,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "in" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1715,7 +1715,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -2453,7 +2453,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "lN" = ( @@ -3052,7 +3052,7 @@ /turf/floor/plating/airless, /area/space) "ps" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/w2) "pu" = ( @@ -3678,7 +3678,7 @@ /turf/floor/tiled, /area/ministation/hop) "rE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -3910,7 +3910,7 @@ /area/ministation/medical) "ss" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "st" = ( @@ -4291,7 +4291,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "tE" = ( @@ -4383,7 +4383,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/cooker/fryer, /turf/floor/lino, /area/ministation/cafe) @@ -4473,7 +4473,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "ub" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -4497,7 +4497,7 @@ /area/ministation/hall/w2) "ud" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l6, /turf/floor/tiled, /area/ministation/hall/w2) @@ -4562,7 +4562,7 @@ /area/ministation/hall/e2) "uq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "us" = ( @@ -4628,7 +4628,7 @@ /area/ministation/hall/w2) "uD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "uG" = ( @@ -4900,7 +4900,7 @@ /area/ministation/cafe) "vw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, @@ -5006,7 +5006,7 @@ /turf/floor/tiled/dark, /area/ministation/medical) "vO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/machinery/light{ dir = 8 @@ -5093,7 +5093,7 @@ /turf/space, /area/space) "wk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5234,7 +5234,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "wD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "wE" = ( @@ -5488,7 +5488,7 @@ /turf/floor/tiled, /area/ministation/hydro) "xy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/green/half{ dir = 1 }, @@ -5597,7 +5597,7 @@ /area/ministation/security) "xQ" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5793,7 +5793,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "yw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -5807,7 +5807,7 @@ /obj/machinery/camera/autoname{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -6132,7 +6132,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "zF" = ( @@ -6173,7 +6173,7 @@ /turf/floor/lino, /area/ministation/cafe) "zK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/lino, @@ -6244,7 +6244,7 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Ae" = ( @@ -6446,7 +6446,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "AJ" = ( @@ -6473,7 +6473,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "AK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 10 }, @@ -6776,7 +6776,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "CL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7240,7 +7240,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "Ft" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/tiled, /area/ministation/security) "Fy" = ( @@ -7274,7 +7274,7 @@ /turf/floor/tiled, /area/ministation/hydro) "FJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7411,7 +7411,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -7476,7 +7476,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "GZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Hd" = ( @@ -7489,7 +7489,7 @@ /obj/effect/floor_decal/industrial/firstaid{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/ministation/hall/e2) "Hn" = ( @@ -7800,7 +7800,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "IX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7903,7 +7903,7 @@ /area/ministation/hall/e2) "Jz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/effect/floor_decal/borderfloorblack/corner{ dir = 4 @@ -7929,7 +7929,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "JJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -8356,18 +8356,18 @@ /area/ministation/medical) "Me" = ( /obj/structure/rack, -/obj/item/target, -/obj/item/target/alien, -/obj/item/target/syndicate, +/obj/item/training_dummy, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/syndicate, /obj/effect/floor_decal/industrial/warning{ dir = 8 }, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/alien, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, /turf/floor/tiled, /area/ministation/security) "Mp" = ( @@ -8530,7 +8530,7 @@ /turf/floor/fake_grass, /area/ministation/hall/e2) "Nh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/effect/floor_decal/industrial/warning/corner{ dir = 4; @@ -8961,7 +8961,7 @@ "Ps" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ministation/cafe) "Pw" = ( @@ -9259,7 +9259,7 @@ /area/ministation/hall/w2) "QO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "QP" = ( @@ -9329,7 +9329,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "Rx" = ( @@ -9471,7 +9471,7 @@ /turf/floor/plating, /area/ministation/arrival) "Sy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning{ dir = 1; @@ -9520,7 +9520,7 @@ /turf/floor/plating, /area/ministation/arrival) "SF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/ss13/l4, /turf/floor/tiled, @@ -9623,7 +9623,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "To" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -9775,7 +9775,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "Ug" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/cable{ icon_state = "4-8" @@ -10239,7 +10239,7 @@ /turf/floor/plating, /area/ministation/arrival) "WC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -10446,7 +10446,7 @@ /turf/floor/tiled/white, /area/ministation/detective) "XK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l14, /turf/floor/tiled, /area/ministation/hall/w2) @@ -10515,7 +10515,7 @@ pixel_x = 32; pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index f70c0d369261..7fd20f4bff76 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -791,7 +791,7 @@ /area/ministation/science) "cJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -1123,7 +1123,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "et" = ( @@ -1363,7 +1363,7 @@ /turf/floor/tiled/white, /area/ministation/science) "fi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4 }, @@ -1628,7 +1628,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -3062,7 +3062,7 @@ /turf/floor/plating, /area/ministation/hall/s3) "nL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/network/relay{ initial_network_id = "molluscnet" }, @@ -3207,7 +3207,7 @@ /turf/floor/tiled/white, /area/ministation/science) "oN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "oP" = ( @@ -3226,7 +3226,7 @@ /turf/floor/laminate/mahogany, /area/ministation/library) "oR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3263,7 +3263,7 @@ /turf/floor/tiled, /area/ministation/bridge) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -3345,7 +3345,7 @@ /turf/floor/plating, /area/ministation/maint/l3nw) "qj" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/item/toy/figure/clown, /turf/floor/reinforced/airless, /area/space) @@ -3509,7 +3509,7 @@ /turf/space, /area/space) "sh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3998,7 +3998,7 @@ /turf/floor/tiled/white, /area/ministation/science) "vJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/apc{ dir = 1; name = "_North APC"; @@ -4151,7 +4151,7 @@ /turf/floor/lino, /area/ministation/telecomms) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4168,7 +4168,7 @@ /area/ministation/library) "xH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4374,7 +4374,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4539,7 +4539,7 @@ /turf/floor/laminate/mahogany, /area/ministation/library) "AH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/n3) "AK" = ( @@ -4651,7 +4651,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "Bk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -4972,7 +4972,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -5328,7 +5328,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Ee" = ( @@ -5554,7 +5554,7 @@ /turf/floor/laminate/mahogany, /area/ministation/library) "Gh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -5687,7 +5687,7 @@ /turf/wall/r_wall/prepainted, /area/space) "HB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "HK" = ( @@ -6472,7 +6472,7 @@ /turf/floor/laminate/yew, /area/ministation/court) "NF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6491,7 +6491,7 @@ /turf/floor/tiled, /area/ministation/bridge) "NJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/flora/pottedplant/aquatic, /turf/floor/lino, @@ -6758,7 +6758,7 @@ /area/space) "Pw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/techfloor/orange, /turf/floor/tiled, /area/ministation/hall/n3) @@ -6839,7 +6839,7 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "PR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "PT" = ( @@ -6985,7 +6985,7 @@ /area/space) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s3) @@ -7098,7 +7098,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "Rv" = ( @@ -7299,7 +7299,7 @@ /area/ministation/science) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "Sq" = ( @@ -7682,7 +7682,7 @@ /turf/floor/tiled/white, /area/ministation/science) "UK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ pixel_x = -3 }, @@ -8114,7 +8114,7 @@ /turf/floor/tiled/white, /area/ministation/science) "XA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning, /obj/structure/railing/mapped, @@ -8223,7 +8223,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Yj" = ( @@ -8439,7 +8439,7 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "Zj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -8542,7 +8542,7 @@ /area/ministation/court) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "ZS" = ( diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index cd027156fa9b..2ecca91fa60e 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -25,6 +25,7 @@ Twice... #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" @@ -65,7 +66,6 @@ Twice... #include "../away/mining/mining.dm" #include "../away/mobius_rift/mobius_rift.dm" #include "../away/smugglers/smugglers.dm" - #include "../away/slavers/slavers_base.dm" #include "../away/unishi/unishi.dm" #include "../away/yacht/yacht.dm" #include "../away/liberia/liberia.dm" @@ -85,7 +85,6 @@ Twice... #include "jobs/security.dm" #include "jobs/science.dm" #include "jobs/tradehouse.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/ministation/ministation_departments.dm b/maps/ministation/ministation_departments.dm index 06aa658ad794..206042093ee9 100644 --- a/maps/ministation/ministation_departments.dm +++ b/maps/ministation/ministation_departments.dm @@ -1,78 +1,6 @@ -/decl/department/service - name = "Service" - announce_channel = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/engineering - name = "Engineering" - announce_channel = "Engineering" - colour = "#ffa500" - display_priority = 2 - display_color = "#fff5cc" - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - announce_channel = "Medical" - colour = "#008000" - display_priority = 3 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - announce_channel = "Science" - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/security - name = "Security" - announce_channel = "Security" - colour = "#dd0000" - display_priority = 4 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - /decl/department/tradehouse name = "Tradehouse" announce_channel = "Tradehouse" colour = "#b98f03" display_priority = 4 - display_color = "#ffddf0" \ No newline at end of file + display_color = "#ffddf0" diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index b8db846a4358..92e28630c1f1 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -1,25 +1,25 @@ /datum/map/ministation - default_job_type = /datum/job/ministation/assistant + default_job_type = /datum/job/assistant/ministation default_department_type = /decl/department/civilian id_hud_icons = 'maps/ministation/hud.dmi' allowed_jobs = list( - /datum/job/ministation/assistant, - /datum/job/ministation/bartender, - /datum/job/ministation/captain, - /datum/job/ministation/cargo, - /datum/job/ministation/robot, + /datum/job/assistant/ministation, + /datum/job/bartender/ministation, + /datum/job/captain/ministation, + /datum/job/cargo_tech/ministation, + /datum/job/robot, /datum/job/computer, - /datum/job/ministation/detective, - /datum/job/ministation/doctor, - /datum/job/ministation/doctor/head, - /datum/job/ministation/engineer, - /datum/job/ministation/engineer/head, - /datum/job/ministation/hop, - /datum/job/ministation/janitor, - /datum/job/ministation/scientist, - /datum/job/ministation/scientist/head, - /datum/job/ministation/security, - /datum/job/ministation/security/head, - /datum/job/ministation/librarian, - /datum/job/ministation/tradehouse/rep + /datum/job/detective/ministation, + /datum/job/doctor/ministation, + /datum/job/cmo/ministation, + /datum/job/engineer/ministation, + /datum/job/chief_engineer/ministation, + /datum/job/hop/ministation, + /datum/job/janitor/ministation, + /datum/job/scientist/ministation, + /datum/job/rd/ministation, + /datum/job/officer/ministation, + /datum/job/hos/ministation, + /datum/job/librarian/ministation, + /datum/job/tradehouse_rep ) \ No newline at end of file diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 29c141e4431e..2834d5bcfb9d 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -4,7 +4,6 @@ #include "blank.dmm" #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/meteor/_meteor.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm index 62b11f8ae724..7eb021cf0cbf 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm @@ -1,17 +1,17 @@ /datum/map_template/ruin/exoplanet/crashed_pod - name = "crashed survival pod" - description = "A crashed survival pod from a destroyed ship." - suffixes = list("crashed_pod/crashed_pod.dmm") - cost = 2 + name = "crashed survival pod" + description = "A crashed survival pod from a destroyed ship." + suffixes = list("crashed_pod/crashed_pod.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK /area/map_template/crashed_pod - name = "\improper Crashed Survival Pod" + name = "\improper Crashed Survival Pod" icon_state = "blue" /decl/submap_archetype/crashed_pod - descriptor = "crashed survival pod" + name = "crashed survival pod" crew_jobs = list(/datum/job/submap/pod) /datum/submap/crashed_pod/sync_cell(var/obj/effect/overmap/visitable/cell) diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 421efa392718..b944f2498005 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -55,18 +55,18 @@ pixel_x = -25 }, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/raisins, /obj/item/chems/drinks/glass2/fitnessflask, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ak" = ( @@ -77,8 +77,8 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "al" = ( @@ -88,21 +88,21 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "am" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "an" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -110,15 +110,15 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/chems/drinks/cans/speer, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ap" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/vomit, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, @@ -134,7 +134,7 @@ "aq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/hydrant{ pixel_x = -27; dir = 4 @@ -147,7 +147,7 @@ icon_state = "4-8" }, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "as" = ( @@ -160,7 +160,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/floor/tiled/techfloor, @@ -169,7 +169,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable{ charge = 50000; inputting = 1; @@ -182,13 +182,13 @@ dir = 8 }, /obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "av" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -196,7 +196,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -217,7 +217,7 @@ /obj/machinery/door/airlock/engineering, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aB" = ( @@ -233,7 +233,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aD" = ( @@ -261,7 +261,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aG" = ( @@ -285,7 +285,7 @@ /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/jumpsuit/wetsuit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/stock_parts/matter_bin/super, @@ -303,7 +303,7 @@ dir = 8 }, /obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aI" = ( @@ -313,8 +313,8 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/shower{ @@ -334,7 +334,7 @@ dir = 1 }, /obj/item/mop, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/box/detergent, @@ -348,7 +348,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aM" = ( @@ -366,19 +366,19 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/cyan, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/item/solar_assembly, /obj/item/solar_assembly, @@ -388,7 +388,7 @@ /area/map_template/crashed_pod) "aQ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aR" = ( @@ -407,7 +407,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -418,16 +418,16 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aV" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aW" = ( @@ -435,7 +435,7 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister/empty, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aX" = ( @@ -443,14 +443,14 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/civilian, /obj/machinery/atmospherics/pipe/simple/hidden/universal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aZ" = ( @@ -462,13 +462,13 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "ba" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bb" = ( @@ -479,7 +479,7 @@ "bc" = ( /obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bd" = ( @@ -490,7 +490,7 @@ /obj/item/radio, /obj/item/radio, /obj/random/plushie, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "be" = ( @@ -502,7 +502,7 @@ pixel_x = -27; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bf" = ( @@ -514,14 +514,14 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bh" = ( @@ -529,37 +529,37 @@ dir = 8 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bi" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bj" = ( /obj/structure/table/steel_reinforced, /obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/glass2/coffeecup/metal, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bk" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bl" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bm" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /turf/floor/tiled/dark, @@ -569,12 +569,12 @@ dir = 4 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bp" = ( @@ -603,7 +603,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bu" = ( @@ -627,7 +627,7 @@ /area/map_template/crashed_pod) "bw" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bx" = ( @@ -639,14 +639,14 @@ /obj/structure/bed/chair{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "by" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bz" = ( @@ -662,7 +662,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bB" = ( @@ -679,9 +679,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bD" = ( @@ -695,8 +695,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bF" = ( @@ -713,7 +713,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -745,13 +745,13 @@ /obj/machinery/light/small, /obj/effect/decal/cleanable/ash, /obj/item/trash/cigbutt/cigarbutt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bL" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bM" = ( @@ -782,7 +782,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bN" = ( @@ -793,10 +793,10 @@ /obj/effect/floor_decal/industrial/warning, /obj/structure/table/steel_reinforced, /obj/item/binoculars, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bP" = ( @@ -830,16 +830,16 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bR" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/geiger, /obj/item/geiger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bS" = ( @@ -884,7 +884,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bV" = ( @@ -979,7 +979,7 @@ /obj/item/ashtray, /obj/item/paper_bin, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pen, /turf/floor/tiled/dark, /area/map_template/crashed_pod) diff --git a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm index 29714944a166..13485f43f126 100644 --- a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm +++ b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm @@ -3,11 +3,11 @@ /turf/template_noop, /area/template_noop) "ac" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/template_noop, /area/template_noop) "ad" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/reinforced/mapped/ocp, /turf/template_noop, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index ed155d0788ad..1edbe07fd68b 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -40,13 +40,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/plating, /area/map_template/oldpod) "ai" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aj" = ( @@ -65,25 +65,25 @@ /obj/structure/bed, /obj/abstract/landmark/corpse/doctor, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "al" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "am" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "an" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ao" = ( @@ -93,7 +93,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ap" = ( @@ -103,7 +103,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aq" = ( @@ -112,8 +112,8 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -121,30 +121,30 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "as" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "at" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "au" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -152,8 +152,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -162,52 +162,52 @@ dir = 4 }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ax" = ( /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced/hull, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/map_template/oldpod) "ay" = ( /obj/item/frame/air_alarm, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/air_alarm, /turf/floor/tiled/monotile, /area/map_template/oldpod) "az" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aA" = ( /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aB" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aC" = ( /obj/item/clothing/head/helmet/space/emergency, /obj/item/clothing/suit/space/emergency, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aD" = ( @@ -223,26 +223,26 @@ /obj/random/tech_supply, /obj/random/tech_supply, /obj/item/tool/pickaxe, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aE" = ( /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aG" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aH" = ( @@ -250,7 +250,7 @@ icon_state = "0-4" }, /obj/item/frame/apc, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cell/crap/empty, /obj/item/stock_parts/circuitboard/apc, /turf/floor/tiled/monotile, @@ -260,29 +260,29 @@ icon_state = "2-8" }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aJ" = ( /obj/abstract/landmark/corpse/pirate, /obj/item/gun/energy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aK" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aL" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aM" = ( @@ -290,17 +290,17 @@ /obj/item/baton/cattleprod, /obj/item/shard, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aN" = ( /obj/machinery/door/firedoor, /obj/structure/wall_frame/hull, /obj/structure/grille, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, /obj/item/shard, /obj/item/shard, /obj/item/shard, @@ -327,7 +327,7 @@ /turf/floor/plating, /area/map_template/oldpod) "aQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aR" = ( @@ -345,16 +345,16 @@ name = "plastic table frame" }, /obj/item/firstaid/surgery, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aS" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aT" = ( @@ -366,7 +366,7 @@ dir = 1 }, /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, @@ -411,16 +411,16 @@ dir = 8 }, /obj/machinery/optable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aZ" = ( @@ -433,7 +433,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "ba" = ( @@ -475,14 +475,14 @@ }, /obj/random/firstaid, /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bf" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bg" = ( @@ -493,9 +493,9 @@ dir = 6; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 808e62d51a2c..6d33bc94adb7 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -922,7 +922,7 @@ /area/map_template/colony/atmospherics) "cf" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/emitter/gyrotron, /turf/floor/concrete, /area/template_noop) @@ -1415,7 +1415,7 @@ "dn" = ( /obj/structure/catwalk, /obj/machinery/rad_collector, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "do" = ( @@ -1576,7 +1576,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/surgery) "dG" = ( @@ -1853,7 +1853,7 @@ "eh" = ( /obj/structure/catwalk, /obj/structure/closet/crate/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ei" = ( @@ -2075,8 +2075,8 @@ /area/map_template/colony/messhall) "eD" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "eE" = ( @@ -2342,8 +2342,8 @@ /area/map_template/colony/medbay) "eZ" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fa" = ( @@ -2361,7 +2361,7 @@ /area/map_template/colony) "fc" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fd" = ( @@ -3204,7 +3204,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gt" = ( @@ -3411,7 +3411,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "gP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gQ" = ( @@ -3429,7 +3429,7 @@ /turf/floor/tiled/steel_ridged, /area/map_template/colony/airlock) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump_out_external" }, @@ -4724,7 +4724,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/map_template/colony/commons) "jm" = ( @@ -4796,7 +4796,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, /area/map_template/colony/commons) "jt" = ( @@ -4981,7 +4981,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/messhall) "jL" = ( @@ -5586,11 +5586,11 @@ /obj/effect/floor_decal/industrial/loading{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kM" = ( @@ -5598,7 +5598,7 @@ id_tag = "playablecolony_crematorium" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kN" = ( @@ -5607,7 +5607,7 @@ pixel_y = 25; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table/steel_reinforced, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/recharger, @@ -5713,15 +5713,15 @@ /area/map_template/colony/airlock) "kZ" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 8 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "la" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lb" = ( @@ -5771,7 +5771,7 @@ /area/map_template/colony) "lg" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lh" = ( @@ -5792,7 +5792,7 @@ id_tag = "colonymine" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_ridged, /area/map_template/colony/mineralprocessing) "lj" = ( @@ -5839,7 +5839,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lo" = ( @@ -5879,7 +5879,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lu" = ( @@ -5890,12 +5890,12 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lv" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lw" = ( @@ -5934,8 +5934,8 @@ dir = 8 }, /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lA" = ( @@ -5946,7 +5946,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lB" = ( @@ -5976,7 +5976,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lD" = ( @@ -5984,7 +5984,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lG" = ( @@ -6026,8 +6026,8 @@ /turf/floor/tiled/white, /area/map_template/colony/bathroom) "lJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ cycle_to_external_air = 1; id_tag = "playablecolonymain"; @@ -6070,7 +6070,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump"; power_rating = 25000 @@ -6127,7 +6127,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lR" = ( @@ -6142,7 +6142,7 @@ name = "Colonial suit cycler"; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lS" = ( @@ -6150,13 +6150,13 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lT" = ( /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lU" = ( @@ -6164,15 +6164,15 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lV" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lW" = ( @@ -6205,7 +6205,7 @@ /area/map_template/colony) "lX" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/item/radio/intercom{ dir = 8; @@ -6232,8 +6232,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "ma" = ( @@ -6256,8 +6256,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6268,8 +6268,8 @@ /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) @@ -6319,7 +6319,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mh" = ( @@ -6329,7 +6329,7 @@ /obj/machinery/door/airlock/external{ id_tag = "playablecolonymain_interior_door" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mi" = ( @@ -6353,7 +6353,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ml" = ( @@ -6385,8 +6385,8 @@ /obj/structure/railing/mapped{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mo" = ( @@ -6422,14 +6422,14 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "ms" = ( /obj/effect/floor_decal/techfloor{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/high_power/on{ dir = 8; target_pressure = 500 @@ -6521,8 +6521,8 @@ name = "Hard Equipment Storage"; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "mD" = ( @@ -6683,19 +6683,19 @@ /obj/effect/floor_decal/techfloor{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mP" = ( /obj/structure/table/steel_reinforced, /obj/machinery/cell_charger, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/flashlight/lamp/floodlamp, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/railing/mapped{ dir = 8 @@ -6789,7 +6789,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7208,9 +7208,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7262,8 +7262,8 @@ icon_state = "4-8" }, /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7283,7 +7283,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7306,7 +7306,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) @@ -7348,7 +7348,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "ob" = ( @@ -7361,7 +7361,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "oc" = ( @@ -7374,7 +7374,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ dir = 8; pixel_x = 22 @@ -7388,43 +7388,43 @@ /obj/effect/floor_decal/industrial/loading{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oe" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "of" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "og" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oh" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oi" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, /obj/structure/rack, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/tool/pickaxe, /obj/item/tool/pickaxe, /obj/item/tool/shovel, @@ -7506,9 +7506,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7520,9 +7520,9 @@ dir = 1 }, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7539,9 +7539,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7560,7 +7560,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "oq" = ( @@ -7568,7 +7568,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "or" = ( @@ -7579,7 +7579,7 @@ /obj/structure/sign/warning/high_voltage{ pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "os" = ( @@ -7587,7 +7587,7 @@ icon_state = "4-8" }, /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ot" = ( @@ -7595,16 +7595,16 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/hydroponics) "ou" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7621,8 +7621,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7646,9 +7646,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7661,38 +7661,38 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7814,8 +7814,8 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "vt" = ( @@ -7936,9 +7936,9 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "Kn" = ( @@ -7954,7 +7954,7 @@ /area/map_template/colony/hydroponics) "Kz" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/spot{ dir = 1 }, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm index e27736fd2515..d0b72f2445f6 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm @@ -1,18 +1,18 @@ #include "../../../../mods/mobs/dionaea/_dionaea.dme" /datum/map_template/ruin/exoplanet/playablecolony - name = "established colony" - description = "a fully functional colony on the frontier of settled space" - suffixes = list("playablecolony/colony.dmm") - cost = 2 + name = "established colony" + description = "a fully functional colony on the frontier of settled space" + suffixes = list("playablecolony/colony.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT apc_test_exempt_areas = list( /area/map_template/colony/mineralprocessing = NO_SCRUBBER|NO_VENT ) /decl/submap_archetype/playablecolony - descriptor = "established colony" + name = "established colony" crew_jobs = list(/datum/job/submap/colonist) /datum/job/submap/colonist diff --git a/maps/shaded_hills/outfits/_outfits.dm b/maps/shaded_hills/outfits/_outfits.dm index e4de3be13439..49b61a0ec63a 100644 --- a/maps/shaded_hills/outfits/_outfits.dm +++ b/maps/shaded_hills/outfits/_outfits.dm @@ -4,13 +4,14 @@ id_type = null pda_type = null l_ear = null - uniform = /obj/item/clothing/pants/trousers/jerkin shoes = /obj/item/clothing/shoes/craftable/boots + uniform = list( + /obj/item/clothing/pants/trousers, + /obj/item/clothing/shirt/jerkin + ) backpack_contents = list( /obj/item/rock/flint/striker, /obj/item/bladed/folding/iron, /obj/item/flame/torch ) - l_pocket = /obj/item/rock/flint/striker - r_pocket = /obj/item/bladed/folding/iron outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL diff --git a/maps/shaded_hills/outfits/shrine.dm b/maps/shaded_hills/outfits/shrine.dm index 1df7dd8b0a92..4f47ac02e623 100644 --- a/maps/shaded_hills/outfits/shrine.dm +++ b/maps/shaded_hills/outfits/shrine.dm @@ -11,4 +11,4 @@ /decl/outfit/job/shaded_hills/shrine/keeper name = "Shaded Hills - Shrine Keeper" suit = /obj/item/clothing/suit/mantle - mask = /obj/item/clothing/neck/necklace/prayer_beads/basalt + mask = /obj/item/clothing/neck/prayer_beads/basalt diff --git a/maps/shaded_hills/shaded_hills_currency.dm b/maps/shaded_hills/shaded_hills_currency.dm index f1c06d4735e4..7c3efd6cbea4 100644 --- a/maps/shaded_hills/shaded_hills_currency.dm +++ b/maps/shaded_hills/shaded_hills_currency.dm @@ -1,7 +1,7 @@ /datum/map/shaded_hills starting_cash_choices = list( - /decl/starting_cash_choice/none, - /decl/starting_cash_choice/cash + /decl/starting_cash_choice/cash, + /decl/starting_cash_choice/none ) default_currency = /decl/currency/imperial salary_modifier = 0.05 // turn the 300-400 base into 15-20 base diff --git a/maps/shaded_hills/shaded_hills_define.dm b/maps/shaded_hills/shaded_hills_define.dm index 00dfd7e31d8c..8415163aa45e 100644 --- a/maps/shaded_hills/shaded_hills_define.dm +++ b/maps/shaded_hills/shaded_hills_define.dm @@ -14,11 +14,13 @@ allowed_latejoin_spawns = list( /decl/spawnpoint/arrivals ) - map_tech_level = MAP_TECH_LEVEL_MEDIEVAL - survival_box_choices = list() - passport_type = null - _available_backpacks = list( - /decl/backpack_outfit/sack + map_tech_level = MAP_TECH_LEVEL_MEDIEVAL + survival_box_choices = list() + passport_type = null + _available_backpacks = list( + /decl/backpack_outfit/sack, + /decl/backpack_outfit/backpack/crafted, + /decl/backpack_outfit/haversack ) lobby_screens = list( 'maps/shaded_hills/pyre_light.png' @@ -50,3 +52,6 @@ /datum/map/shaded_hills/get_map_info() return "You're in the [station_name] of the [system_name], nestled between the mountains and the river and bisected by the decaying Queens' Road. On all sides, you are surrounded by untamed wilds, with only a small ruined fort, rebuilt into an inn, to the east as a sign of civilisation. \ Far from the control of [boss_name], you are free to carve forward a path to survival for yourself and your comrades however you wish. Strike the earth!" + +/datum/map/shaded_hills/get_available_submap_archetypes() + return null // Return list of decl instances when relevant submaps exist. diff --git a/maps/tradeship/jobs/_goals.dm b/maps/tradeship/jobs/_goals.dm index c0c13ad937df..e9d719bd2116 100644 --- a/maps/tradeship/jobs/_goals.dm +++ b/maps/tradeship/jobs/_goals.dm @@ -25,7 +25,10 @@ var/global/list/tradeship_paperwork_end_areas = list() /datum/goal/department/paperwork/tradeship paperwork_types = list(/obj/item/paperwork/tradeship) - signatory_job_list = list(/datum/job/tradeship_captain, /datum/job/tradeship_first_mate) + signatory_job_list = list( + /datum/job/captain/tradeship, + /datum/job/tradeship_first_mate + ) /datum/goal/department/paperwork/tradeship/get_paper_spawn_turfs() return global.tradeship_paperwork_spawn_turfs diff --git a/maps/tradeship/jobs/civilian.dm b/maps/tradeship/jobs/civilian.dm index c15bb5c5a770..f491bc953a3c 100644 --- a/maps/tradeship/jobs/civilian.dm +++ b/maps/tradeship/jobs/civilian.dm @@ -1,21 +1,10 @@ -/datum/job/tradeship_deckhand +/datum/job/assistant/tradeship title = "Deck Hand" - total_positions = -1 - spawn_positions = -1 supervisors = "literally everyone, you bottom feeder" outfit_type = /decl/outfit/job/tradeship/hand alt_titles = list( "Cook" = /decl/outfit/job/tradeship/hand/cook, "Cargo Hand", - "Passenger") - department_types = list(/decl/department/civilian) - economic_power = 1 - access = list() - minimal_access = list() + "Passenger" + ) event_categories = list(ASSIGNMENT_GARDENER, ASSIGNMENT_JANITOR) - -/datum/job/tradeship_deckhand/get_access() - if(get_config_value(/decl/config/toggle/assistant_maint)) - return list(access_maint_tunnels) - else - return list() diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index a6d37fe665e0..0d124a9841e0 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -1,4 +1,4 @@ -/datum/job/tradeship_captain +/datum/job/captain/tradeship title = "Captain" supervisors = "your profit margin, your conscience, and the Trademaster" outfit_type = /decl/outfit/job/tradeship/captain @@ -8,36 +8,15 @@ SKILL_SCIENCE = SKILL_ADEPT, SKILL_PILOT = SKILL_ADEPT ) - max_skill = list( - SKILL_PILOT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) - skill_points = 30 - head_position = 1 - department_types = list(/decl/department/command) - total_positions = 1 - spawn_positions = 1 - selection_color = "#1d1d4f" - req_admin_notify = 1 - access = list() - minimal_access = list() - minimal_player_age = 14 - economic_power = 20 ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/captain/tradeship/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship H.verbs |= /mob/proc/tradehouse_rename_company -/datum/job/tradeship_captain/get_access() - return get_all_station_access() - /mob/proc/tradehouse_rename_ship() set name = "Rename Tradeship" set category = "Captain's Powers" diff --git a/maps/tradeship/jobs/engineering.dm b/maps/tradeship/jobs/engineering.dm index 1586944c1bf9..1938f034a310 100644 --- a/maps/tradeship/jobs/engineering.dm +++ b/maps/tradeship/jobs/engineering.dm @@ -1,126 +1,10 @@ -/datum/job/tradeship_engineer +/datum/job/engineer/tradeship title = "Junior Engineer" supervisors = "the Head Engineer" outfit_type = /decl/outfit/job/tradeship/hand/engine - department_types = list(/decl/department/engineering) - total_positions = 8 - spawn_positions = 7 - selection_color = "#5b4d20" - economic_power = 5 - minimal_player_age = 7 - access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - minimal_access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) - skill_points = 20 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/tradeship_engineer/head +/datum/job/chief_engineer/tradeship title = "Head Engineer" - head_position = 1 - department_types = list( - /decl/department/engineering, - /decl/department/command - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#7f6e2c" - req_admin_notify = 1 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - access = list( - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_heads, - access_teleporter, - access_external_airlocks, - access_atmospherics, - access_emergency_storage, - access_eva, - access_bridge, - access_construction, access_sec_doors, - access_ce, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_ai_upload - ) - minimal_access = list( - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_heads, - access_teleporter, - access_external_airlocks, - access_atmospherics, - access_emergency_storage, - access_eva, - access_bridge, - access_construction, - access_sec_doors, - access_ce, access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_ai_upload - ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/tradeship/chief_engineer - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_ADEPT, - SKILL_EVA = SKILL_ADEPT, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_ADEPT, - SKILL_ATMOS = SKILL_ADEPT, - SKILL_ENGINES = SKILL_EXPERT - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) - skill_points = 30 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) diff --git a/maps/tradeship/jobs/medical.dm b/maps/tradeship/jobs/medical.dm index 55ff9ea2f1ce..03b480321b82 100644 --- a/maps/tradeship/jobs/medical.dm +++ b/maps/tradeship/jobs/medical.dm @@ -1,9 +1,8 @@ -/datum/job/tradeship_doctor +/datum/job/doctor/tradeship title = "Junior Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor and the Captain" alt_titles = list() + // Slightly beefier skills due to smaller crew. skill_points = 24 min_skill = list( SKILL_LITERACY = SKILL_ADEPT, @@ -16,11 +15,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - minimal_player_age = 3 - total_positions = 5 - spawn_positions = 3 - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -39,61 +33,10 @@ outfit_type = /decl/outfit/job/tradeship/doc/junior event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/tradeship_doctor/head +/datum/job/cmo/tradeship title = "Head Doctor" - head_position = 1 - department_types = list( - /decl/department/medical, - /decl/department/command - ) supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/tradeship/doc alt_titles = list("Surgeon") - total_positions = 1 - spawn_positions = 1 + // Slightly beefier skills due to smaller crew. skill_points = 28 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - selection_color = "#026865" - req_admin_notify = 1 - economic_power = 10 - access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_player_age = 14 - ideal_character_age = 50 - event_categories = list(ASSIGNMENT_MEDICAL) diff --git a/maps/tradeship/jobs/science.dm b/maps/tradeship/jobs/science.dm index 4c6e5555d8e2..c14bb9e5b928 100644 --- a/maps/tradeship/jobs/science.dm +++ b/maps/tradeship/jobs/science.dm @@ -1,119 +1,14 @@ -/datum/job/tradeship_researcher +/datum/job/scientist/tradeship title = "Junior Researcher" supervisors = "the Head Researcher and the Captain" total_positions = 2 spawn_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher/junior - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) + // Smaller crew, more points. skill_points = 24 - department_types = list(/decl/department/science) - selection_color = "#633d63" - economic_power = 7 - minimal_player_age = 7 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/tradeship_researcher/head +/datum/job/rd/tradeship title = "Head Researcher" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_FINANCE = SKILL_ADEPT, - SKILL_BOTANY = SKILL_BASIC, - SKILL_ANATOMY = SKILL_BASIC, - SKILL_DEVICES = SKILL_BASIC, - SKILL_SCIENCE = SKILL_ADEPT - ) - max_skill = list( - SKILL_ANATOMY = SKILL_MAX, - SKILL_DEVICES = SKILL_MAX, - SKILL_SCIENCE = SKILL_MAX - ) - skill_points = 30 - head_position = 1 - department_types = list( - /decl/department/science, - /decl/department/command - ) - selection_color = "#ad6bad" - req_admin_notify = 1 - economic_power = 15 - access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - access_research, - access_robotics, - access_xenobiology, - access_ai_upload, - access_tech_storage, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_gateway, - access_xenoarch, - access_network - ) - minimal_access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - access_research, - access_robotics, - access_xenobiology, - access_ai_upload, - access_tech_storage, - access_RC_announce, - access_keycard_auth, - access_tcomsat, - access_gateway, - access_xenoarch, - access_network - ) - minimal_player_age = 14 - ideal_character_age = 50 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - event_categories = list(ASSIGNMENT_SCIENTIST) diff --git a/maps/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm deleted file mode 100644 index e10101d48a2c..000000000000 --- a/maps/tradeship/jobs/synthetics.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/job/tradeship_robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" - skill_points = 0 - no_skill_buffs = TRUE - guestbanned = 1 - not_random_selectable = 1 - skip_loadout_preview = TRUE - department_types = list(/decl/department/miscellaneous) - -/datum/job/tradeship_robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/tradeship_robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/tradeship_robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 9396c6f0d050..f68f5a6eeb97 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -108,7 +108,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "ap" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -188,7 +188,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/button/access/interior{ dir = 1; id_tag = "lower_cargo"; @@ -198,7 +198,7 @@ /area/ship/trade/loading_bay) "ax" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -322,7 +322,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "aI" = ( @@ -598,7 +598,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bj" = ( @@ -609,7 +609,7 @@ /area/ship/trade/fore_port_underside_maint) "bk" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/paicard, /turf/floor, @@ -618,7 +618,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/mollusc_shell/clam, /turf/floor, /area/ship/trade/disused) @@ -741,7 +741,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bG" = ( @@ -752,7 +752,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/vending/cola{ dir = 4 }, @@ -886,7 +886,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bW" = ( @@ -1000,7 +1000,7 @@ dir = 8; flickering = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1061,7 +1061,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled, /area/ship/trade/loading_bay) @@ -1101,7 +1101,7 @@ /turf/floor, /area/ship/trade/loading_bay) "iy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1156,7 +1156,7 @@ /area/ship/trade/loading_bay) "lg" = ( /obj/item/stool/bar/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1182,7 +1182,7 @@ /turf/floor, /area/ship/trade/aft_port_underside_maint) "lv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/bluegrid, /area/ship/trade/undercomms) "lA" = ( @@ -1248,7 +1248,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "oO" = ( @@ -1280,7 +1280,7 @@ /turf/floor, /area/ship/trade/loading_bay) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "pG" = ( @@ -1301,7 +1301,7 @@ /turf/floor/plating, /area/ship/trade/loading_bay) "qt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "qK" = ( @@ -1319,7 +1319,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/backpack/dufflebag, /obj/item/chems/glass/rag, /obj/item/chems/glass/bucket, @@ -1530,7 +1530,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1637,7 +1637,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "DT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1651,7 +1651,7 @@ dir = 4 }, /obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Ff" = ( @@ -1659,7 +1659,7 @@ /turf/floor/carpet/red, /area/ship/trade/disused) "Ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1669,7 +1669,7 @@ /turf/floor, /area/ship/trade/undercomms) "Fy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/trash, /turf/floor/tiled, /area/ship/trade/disused) @@ -1751,7 +1751,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Iv" = ( @@ -2030,7 +2030,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 8; pixel_x = -24 @@ -2054,7 +2054,7 @@ "QW" = ( /obj/item/stack/tile/floor/five, /obj/item/crowbar/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor, /area/ship/trade/disused) @@ -2094,7 +2094,7 @@ /obj/item/radio/intercom{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/junk, /turf/floor, /area/ship/trade/disused) diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index e72c0805f176..8c98a303b76a 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -292,7 +292,7 @@ /turf/floor/plating, /area/ship/trade/cargo/lower) "aH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, @@ -486,7 +486,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/lower) "bd" = ( @@ -655,7 +655,7 @@ /obj/structure/cable{ icon_state = "6-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "bw" = ( @@ -739,7 +739,7 @@ /turf/floor/tiled, /area/ship/trade/maintenance/lower) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24 @@ -828,7 +828,7 @@ /area/ship/trade/cargo/lower) "bV" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/scrubber, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -1024,7 +1024,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "cC" = ( @@ -1144,7 +1144,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 4 }, @@ -1337,11 +1337,11 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "dv" = ( @@ -1357,7 +1357,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/corner{ dir = 1; icon_state = "warningcorner" @@ -1400,14 +1400,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dB" = ( /obj/structure/table, /obj/random/plushie, /obj/item/synthesized_instrument/violin, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dD" = ( @@ -1608,7 +1608,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1619,7 +1619,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -1638,7 +1638,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/eva) "ep" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1; icon_state = "bulb1" @@ -1687,7 +1687,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ew" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1714,7 +1714,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1751,7 +1751,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eD" = ( @@ -1776,7 +1776,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light_switch{ pixel_x = 24; @@ -1795,14 +1795,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/eva) "eS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eV" = ( @@ -1849,7 +1849,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/storage) "fa" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "fb" = ( @@ -1981,7 +1981,7 @@ /turf/floor, /area/ship/trade/science/fabricaton) "hI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1; icon_state = "warning" @@ -2151,7 +2151,7 @@ /obj/machinery/conveyor_switch{ id_tag = "con" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2340,7 +2340,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/maintenance/techstorage) "rB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/iron, /obj/item/stack/material/ore/coal{ pixel_x = 3; @@ -2443,7 +2443,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "un" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, @@ -2562,7 +2562,7 @@ }, /obj/item/bedsheet/mime, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "xa" = ( @@ -2672,7 +2672,7 @@ /turf/floor/tiled/dark, /area/ship/trade/crew/dorms1) "Bq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2737,7 +2737,7 @@ dir = 4; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "DQ" = ( @@ -2864,7 +2864,7 @@ /area/ship/trade/science/fabricaton) "IU" = ( /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2948,7 +2948,7 @@ /turf/floor/lino, /area/ship/trade/crew/dorms2) "Lx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2968,7 +2968,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "LN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2991,7 +2991,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/maintenance/lower) "Mx" = ( @@ -2999,7 +2999,7 @@ /turf/wall, /area/ship/trade/escape_port) "Nb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3279,7 +3279,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, @@ -3376,7 +3376,7 @@ /turf/floor/tiled/white, /area/ship/trade/science/fabricaton) "Zv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/alarm{ dir = 4; diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index c9ab89371260..2eb597a678c5 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -275,7 +275,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay/chemistry) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/emcloset, /obj/random/voidsuit, /obj/random/voidhelmet, @@ -528,7 +528,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -645,7 +645,7 @@ /turf/wall/r_wall, /area/ship/trade/dock) "bn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -21 @@ -676,7 +676,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/outgoing/general) "br" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/emergency_dispenser/north, /turf/floor/tiled/monotile, /area/ship/trade/dock) @@ -733,7 +733,7 @@ "bv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -820,7 +820,7 @@ /turf/floor/plating, /area/ship/trade/dock) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/warning/vacuum{ dir = 4; pixel_x = -34 @@ -828,7 +828,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -990,7 +990,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/steeldecal/steel_decals6, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8; @@ -1340,7 +1340,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -1647,7 +1647,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) @@ -1664,7 +1664,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 4; @@ -1681,7 +1681,7 @@ /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) "dO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1700,7 +1700,7 @@ /turf/wall, /area/ship/trade/crew/saloon) "dQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 9 }, @@ -1730,7 +1730,7 @@ /turf/floor/tiled, /area/ship/trade/crew/saloon) "dV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -1869,7 +1869,7 @@ /area/ship/trade/crew/kitchen) "ez" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eA" = ( @@ -1920,7 +1920,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1933,7 +1933,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 4; icon_state = "bulb1" @@ -2005,7 +2005,7 @@ /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2223,7 +2223,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay) "fp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/open, /area/ship/trade/cargo) @@ -2624,7 +2624,7 @@ /area/ship/trade/cargo) "gt" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ @@ -2817,7 +2817,7 @@ /turf/floor/tiled, /area/ship/trade/garden) "hi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -2904,7 +2904,7 @@ /turf/floor/plating, /area/ship/trade/crew/hallway/starboard) "ht" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3187,7 +3187,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "hV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3345,7 +3345,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "ij" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -3365,7 +3365,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3387,7 +3387,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3532,7 +3532,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "iz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -3654,7 +3654,7 @@ /area/ship/trade/maintenance/atmos) "iN" = ( /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "iQ" = ( @@ -4863,8 +4863,8 @@ /turf/floor/plating, /area/ship/trade/shieldbay) "pT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -4973,7 +4973,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/rescue) "qO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/computer/modular/preset/merchant/tradeship, /obj/machinery/light_switch{ @@ -6414,7 +6414,7 @@ pixel_x = 30; pixel_y = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "GO" = ( @@ -6659,7 +6659,7 @@ /area/ship/trade/crew/saloon) "Jp" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/meat_hook, /obj/machinery/newscaster{ pixel_y = -32; @@ -7277,7 +7277,7 @@ /turf/floor/bluegrid, /area/ship/trade/command/bridge) "Qc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -7359,7 +7359,7 @@ dir = 1; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "Rb" = ( @@ -7420,7 +7420,7 @@ /turf/floor/carpet/blue, /area/ship/trade/command/captain) "Rv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Cargo Technician" }, @@ -7699,7 +7699,7 @@ /turf/wall/titanium, /area/ship/trade/shuttle/outgoing/general) "UV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/ship/trade/dock) "UY" = ( @@ -7918,7 +7918,7 @@ /turf/floor/tiled, /area/ship/trade/shuttle/outgoing/general) "Xz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "XG" = ( @@ -7951,7 +7951,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/engine/aft) "Ya" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/structure/catwalk, /obj/structure/railing/mapped, diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index eba7b7f15ab4..1a4f81e3fb31 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -870,7 +870,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/trade/comms) "yM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/plating, /area/ship/trade/bridge_unused) diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 115fdd551c98..32eeb975e2ca 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -5,7 +5,6 @@ #endif #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" @@ -18,6 +17,7 @@ #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/bigpharma/_bigpharma.dme" @@ -53,14 +53,12 @@ #include "../away/mining/mining.dm" #include "../away/mobius_rift/mobius_rift.dm" #include "../away/smugglers/smugglers.dm" - #include "../away/slavers/slavers_base.dm" #include "../away/unishi/unishi.dm" #include "../away/yacht/yacht.dm" #include "../away/liberia/liberia.dm" #include "tradeship_antagonists.dm" #include "tradeship_areas.dm" - #include "tradeship_departments.dm" #include "tradeship_documents.dm" #include "tradeship_jobs.dm" #include "tradeship_loadouts.dm" @@ -80,7 +78,6 @@ #include "jobs/engineering.dm" #include "jobs/medical.dm" #include "jobs/science.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index 37acc9665636..61b526624e0d 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -1,19 +1,19 @@ /datum/map/tradeship - default_job_type = /datum/job/tradeship_deckhand + default_job_type = /datum/job/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate id_hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( - /datum/job/tradeship_deckhand, - /datum/job/tradeship_captain, + /datum/job/assistant/tradeship, + /datum/job/captain/tradeship, /datum/job/tradeship_first_mate, - /datum/job/tradeship_doctor/head, - /datum/job/tradeship_doctor, - /datum/job/tradeship_engineer/head, - /datum/job/tradeship_engineer, - /datum/job/tradeship_researcher/head, - /datum/job/tradeship_researcher, - /datum/job/tradeship_robot + /datum/job/cmo/tradeship, + /datum/job/doctor/tradeship, + /datum/job/chief_engineer/tradeship, + /datum/job/engineer/tradeship, + /datum/job/rd/tradeship, + /datum/job/scientist/tradeship, + /datum/job/robot ) /obj/machinery/suit_cycler/tradeship @@ -39,4 +39,4 @@ /obj/item/clothing/head/helmet/space/void/excavation, /obj/item/clothing/head/helmet/space/void/engineering/salvage )) - . = ..() \ No newline at end of file + . = ..() diff --git a/maps/tradeship/tradeship_spawnpoints.dm b/maps/tradeship/tradeship_spawnpoints.dm index 054216b46fea..c4be5d21c350 100644 --- a/maps/tradeship/tradeship_spawnpoints.dm +++ b/maps/tradeship/tradeship_spawnpoints.dm @@ -9,7 +9,7 @@ /decl/spawnpoint/cryo name = "Port Cryogenic Storage" spawn_announcement = "has completed revival in the port cryogenics bay" - disallow_job = list(/datum/job/tradeship_robot) + disallow_job = list(/datum/job/robot) /decl/spawnpoint/cryo/two name = "Starboard Cryogenic Storage" @@ -22,7 +22,7 @@ /decl/spawnpoint/cryo/captain name = "Captain Compartment" spawn_announcement = "has completed revival in the captain compartment" - restrict_job = list(/datum/job/tradeship_captain) + restrict_job = list(/datum/job/captain/tradeship) uid = "spawn_cryo_captain" /obj/abstract/landmark/latejoin/cryo_captain diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index fa0aaa499777..f425cff9c96d 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -4,7 +4,7 @@ var/global/list/all_maps = list() var/global/const/MAP_HAS_BRANCH = 1 //Branch system for occupations, togglable var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable -/hook/startup/proc/initialise_map_list() +/proc/initialise_map_list() for(var/type in subtypesof(/datum/map)) var/datum/map/M if(type == global.using_map.type) @@ -527,3 +527,6 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable /datum/map/proc/finalize_map_generation() return + +/datum/map/proc/get_available_submap_archetypes() + return decls_repository.get_decls_of_subtype_unassociated(/decl/submap_archetype) diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 279002ba2515..1e8accdf3061 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -56,6 +56,10 @@ if(length(credits_nouns)) SSlore.credits_nouns |= credits_nouns +/// This runs on-roundstart after roundstart characters have been created. +/decl/modpack/proc/on_roundstart() + return + /decl/modpack/proc/get_membership_perks() return @@ -70,11 +74,11 @@ . = "

Modpacks List



" for(var/modpack in SSmodpacks.loaded_modpacks) var/decl/modpack/M = SSmodpacks.loaded_modpacks[modpack] - + if(M.name) . += "
" . += "
[M.name]
" - + if(M.desc || M.author) . += "
" if(M.desc) diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index fbebd801b954..4eba38ba1b61 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -3,7 +3,7 @@ desc = "This limb has a white polymer casing with blue holo-displays." icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -15,7 +15,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_rook.dmi' has_eyes = FALSE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_SECONDARY ) @@ -41,7 +41,7 @@ desc = "This limb has a sleek black and white polymer finish." icon_base = 'mods/content/corporate/icons/cyberlimbs/zenghu/zenghu_spirit.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -52,7 +52,7 @@ desc = "This skeletal mechanical limb has a minimalist black and red casing." icon_base = 'mods/content/corporate/icons/cyberlimbs/xion/xion_econo.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -64,7 +64,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -81,7 +81,7 @@ desc = "This limb is simple and functional; no effort has been made to make it look human." icon_base = 'mods/content/corporate/icons/cyberlimbs/morpheus/morpheus_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel uid = "bodytype_prosthetic_morpheus" /decl/bodytype/prosthetic/morpheus/mantis @@ -99,7 +99,7 @@ body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID // todo: add synthflesh material? - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -123,7 +123,7 @@ desc = "This limb has a minimalist black and red casing." icon_base = 'mods/content/corporate/icons/cyberlimbs/xion/xion_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -134,7 +134,7 @@ desc = "This limb is made from a cheap polymer." icon_base = 'mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/plastic + organ_material = /decl/material/solid/organic/plastic uid = "bodytype_prosthetic_nanotrasen" DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/shellguard, shellguard) diff --git a/mods/content/corporate/items/stamps.dm b/mods/content/corporate/items/stamps.dm index cfc6df4dbbf9..35b358297287 100644 --- a/mods/content/corporate/items/stamps.dm +++ b/mods/content/corporate/items/stamps.dm @@ -4,7 +4,7 @@ /obj/item/stamp/hop name = "head of personnel's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_xo.dmi' + icon = 'icons/obj/items/stamps/stamp_cap.dmi' /obj/item/stamp/ce name = "chief engineer's rubber stamp" @@ -32,7 +32,7 @@ /obj/item/stamp/ward name = "warden's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_cos.dmi' + icon = 'icons/obj/items/stamps/stamp_brig.dmi' /obj/item/stamp/internalaffairs name = "internal affairs' rubber stamp" diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm index fbbad10735d1..4752b9d4bbf7 100644 --- a/mods/content/dungeon_loot/subtypes/bookcase.dm +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -41,7 +41,7 @@ /obj/item/paper/scroll, /obj/item/pen/fancy/quill, /obj/item/pen/fancy/quill, - /obj/item/clothing/neck/necklace/prayer_beads/random, + /obj/item/clothing/neck/prayer_beads/random, /obj/item/hourglass, ) return common_loot diff --git a/mods/content/dungeon_loot/subtypes/maint.dm b/mods/content/dungeon_loot/subtypes/maint.dm index 1063d1d165f8..cea9732ac81c 100644 --- a/mods/content/dungeon_loot/subtypes/maint.dm +++ b/mods/content/dungeon_loot/subtypes/maint.dm @@ -146,7 +146,7 @@ /obj/item/food/old/hotdog, /obj/item/food/old/pizza, /obj/item/ammo_casing, - /obj/item/stack/material/rods/ten, + /obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/five, /obj/item/stack/material/cardstock/mapped/cardboard/five, /obj/item/poster, diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 1bf5230189d7..2dcfaa8cde52 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -31,6 +31,7 @@ #include "items\clothing\_overrides.dm" #include "items\clothing\_recipes.dm" #include "items\clothing\armor.dm" +#include "items\clothing\cloak.dm" #include "items\clothing\glasses.dm" #include "items\clothing\jerkin.dm" #include "items\clothing\loincloth.dm" diff --git a/mods/content/fantasy/datum/outfits.dm b/mods/content/fantasy/datum/outfits.dm index 1697f5eb44ff..3b65521921b4 100644 --- a/mods/content/fantasy/datum/outfits.dm +++ b/mods/content/fantasy/datum/outfits.dm @@ -1,7 +1,10 @@ /decl/outfit/job/generic/fantasy - name = "Fantasy Outfit" - id_type = null - pda_type = null - l_ear = null - uniform = /obj/item/clothing/pants/trousers/jerkin - shoes = /obj/item/clothing/shoes/craftable/boots \ No newline at end of file + name = "Fantasy Outfit" + id_type = null + pda_type = null + l_ear = null + shoes = /obj/item/clothing/shoes/craftable/boots + uniform = list( + /obj/item/clothing/pants/trousers, + /obj/item/clothing/shirt/jerkin + ) diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 164ade162b6d..9829bf61335f 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -73,7 +73,7 @@ /decl/skill/crafting/artifice name = "Artifice" uid = "skill_crafting_artifice" - desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects." + desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects like cut gems or jewellery." levels = list( "Unskilled" = "You know that gears turn together when intermeshed and that axles are used to connect spinning things, but you've never done more work on a machine than hitting it if it's broken. You struggle with the precision needed to work on finely-detailed objects.", "Basic" = "You know some basic mechanical principles, like the construction of a basic pulley, or how to put a wheel on an axle. You could fix a broken or stuck well winch, but you'd struggle to deal with a malfunctioning windmill or granary. You have a steadier hand than most, able to place small gems on jewelry and connect small mechanisms.", @@ -306,3 +306,9 @@ "Experienced" = "You work as an pharmacist, or else you are a doctor with training in chemistry. If you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book.
- You can examine held containers for some reagents.", "Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation.
- You can examine held containers for all reagents." ) + +/datum/lock + lockpicking_skill = SKILL_ARTIFICE + +/obj/item/gemstone + work_skill = SKILL_ARTIFICE diff --git a/mods/content/fantasy/icons/clothing/jerkin.dmi b/mods/content/fantasy/icons/clothing/jerkin.dmi index bbcf50e66de6..158ce68fbeb6 100644 Binary files a/mods/content/fantasy/icons/clothing/jerkin.dmi and b/mods/content/fantasy/icons/clothing/jerkin.dmi differ diff --git a/mods/content/fantasy/icons/clothing/trousers.dmi b/mods/content/fantasy/icons/clothing/trousers.dmi index 2e76069619a7..72c80d25259a 100644 Binary files a/mods/content/fantasy/icons/clothing/trousers.dmi and b/mods/content/fantasy/icons/clothing/trousers.dmi differ diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 9d7f449a9f5c..1fb533a085df 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -34,10 +34,26 @@ slot = slot_w_uniform_str uid = "gear_fantasy_loincloth" +/decl/loadout_option/fantasy/uniform/shirt + name = "shirt" + path = /obj/item/clothing/shirt/crafted + uid = "gear_fantasy_shirt" + available_materials = list( + /decl/material/solid/organic/cloth, + /decl/material/solid/organic/cloth/wool, + /decl/material/solid/organic/cloth/hemp, + /decl/material/solid/organic/cloth/linen + ) + /decl/loadout_option/fantasy/uniform/jerkin name = "jerkin" path = /obj/item/clothing/shirt/jerkin uid = "gear_fantasy_jerkin" + available_materials = list( + /decl/material/solid/organic/leather, + /decl/material/solid/organic/skin/feathers, + /decl/material/solid/organic/skin/fur + ) /decl/loadout_option/fantasy/uniform/tunic name = "tunic" @@ -102,6 +118,11 @@ path = /obj/item/clothing/suit/hooded_cloak uid = "gear_fantasy_cloak_hooded" +/decl/loadout_option/fantasy/suit/winter_cloak + name = "cloak, winter" + path = /obj/item/clothing/suit/hooded_cloak/winter + uid = "gear_fantasy_cloak_hooded_winter" + /decl/loadout_option/fantasy/suit/poncho name = "poncho" path = /obj/item/clothing/suit/poncho/colored @@ -182,7 +203,7 @@ /decl/loadout_option/fantasy/neck/prayer_beads name = "prayer beads" - path = /obj/item/clothing/neck/necklace/prayer_beads + path = /obj/item/clothing/neck/prayer_beads available_materials = list( /decl/material/solid/organic/bone, /decl/material/solid/stone/marble, @@ -288,6 +309,18 @@ "white wine" = /decl/material/liquid/ethanol/wine/premium, )) +/decl/loadout_option/fantasy/utility/crutch + name = "crutch" + path = /obj/item/crutch/wooden/padded + available_materials = list( + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/walnut + ) + uid = "gear_fantasy_crutch" + /decl/loadout_option/fantasy/eyes abstract_type = /decl/loadout_option/fantasy/eyes slot = slot_glasses_str diff --git a/mods/content/fantasy/items/clothing/_recipes.dm b/mods/content/fantasy/items/clothing/_recipes.dm index 219a875f5bd0..99942d8918ed 100644 --- a/mods/content/fantasy/items/clothing/_recipes.dm +++ b/mods/content/fantasy/items/clothing/_recipes.dm @@ -1,5 +1,5 @@ /decl/stack_recipe/textiles/jerkin - result_type = /obj/item/clothing/shirt/jerkin + result_type = /obj/item/clothing/shirt/crafted category = "clothing" /decl/stack_recipe/textiles/gown diff --git a/mods/content/fantasy/items/clothing/armor.dm b/mods/content/fantasy/items/clothing/armor.dm index fd475c07f32a..22651d3243d5 100644 --- a/mods/content/fantasy/items/clothing/armor.dm +++ b/mods/content/fantasy/items/clothing/armor.dm @@ -1,3 +1,3 @@ // Override of the base item to add lore to the desc. /obj/item/clothing/suit/armor/forged/banded - desc = "A suit of overlapping armoured plates that covers the upper and lower body. Favoured by the Aegis and many Splinter Kingdoms." + desc = "A suit of overlapping armoured plates that covers the upper and lower body. Historically favoured by the Aegis and loyally adopted by many Splinter Kingdoms." diff --git a/mods/content/fantasy/items/clothing/cloak.dm b/mods/content/fantasy/items/clothing/cloak.dm new file mode 100644 index 000000000000..f61d886efe5a --- /dev/null +++ b/mods/content/fantasy/items/clothing/cloak.dm @@ -0,0 +1,17 @@ +// TODO: big fuckoff fur collar icons +/obj/item/clothing/head/hood/cloak/winter + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/hooded_cloak/winter + cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS|SLOT_HANDS|SLOT_FEET + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + hood = /obj/item/clothing/head/hood/cloak/winter + protects_against_weather = TRUE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/robe/sleeved/shrine + material = /decl/material/solid/organic/cloth/linen + paint_color = COLOR_DARK_RED + markings_color = COLOR_OFF_WHITE + markings_state_modifier = "_sleeves" diff --git a/mods/content/fantasy/items/clothing/jerkin.dm b/mods/content/fantasy/items/clothing/jerkin.dm index dc437db931dd..942a871a81cb 100644 --- a/mods/content/fantasy/items/clothing/jerkin.dm +++ b/mods/content/fantasy/items/clothing/jerkin.dm @@ -5,3 +5,15 @@ _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather + +/obj/item/clothing/shirt/crafted + desc = "A simple shirt, worn on the upper body." + icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' // TODO state with sleeves + sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/shirt/crafted/wool + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/shirt/crafted/linen + material = /decl/material/solid/organic/cloth/linen diff --git a/mods/content/fantasy/items/clothing/trousers.dm b/mods/content/fantasy/items/clothing/trousers.dm index cbe30375bff0..4fac34236e9b 100644 --- a/mods/content/fantasy/items/clothing/trousers.dm +++ b/mods/content/fantasy/items/clothing/trousers.dm @@ -7,12 +7,9 @@ color = /decl/material/solid/organic/leather::color _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' -/obj/item/clothing/pants/trousers/jerkin/Initialize() - . = ..() - var/obj/item/clothing/shirt/jerkin/jerkin = new - attach_accessory(null, jerkin) - if(!(jerkin in accessories)) - qdel(jerkin) +/obj/item/clothing/pants/trousers/linen + material = /decl/material/solid/organic/cloth/linen + color = /decl/material/solid/organic/cloth/linen::color /obj/item/clothing/pants/trousers/braies name = "braies" diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index 8779b3ce78de..fc98131743c2 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -221,23 +221,23 @@ /turf/wall, /area/icarus/vessel) "aY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aZ" = ( /obj/random/obstruction, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "ba" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, /area/icarus/vessel) "bb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "bc" = ( @@ -395,7 +395,7 @@ /area/icarus/vessel) "bE" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bF" = ( @@ -405,21 +405,21 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bH" = ( /obj/structure/hygiene/shower{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bI" = ( /obj/structure/hygiene/shower{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bJ" = ( @@ -514,7 +514,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bY" = ( @@ -528,14 +528,14 @@ dir = 4 }, /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ca" = ( /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, /area/icarus/vessel) @@ -625,7 +625,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cq" = ( @@ -633,7 +633,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cr" = ( @@ -652,7 +652,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ct" = ( @@ -699,7 +699,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/corpse/chef, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, @@ -784,7 +784,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "cO" = ( @@ -878,14 +878,14 @@ /obj/structure/broken_cryo/icarus{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dd" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -921,8 +921,8 @@ "dj" = ( /obj/structure/table, /obj/item/towel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -937,7 +937,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dm" = ( @@ -971,7 +971,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/icarus/vessel) "ds" = ( @@ -983,13 +983,13 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "du" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dv" = ( @@ -1030,13 +1030,13 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( /obj/structure/table, /obj/random/accessory, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1098,7 +1098,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1125,7 +1125,7 @@ /area/icarus/open) "dR" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "dS" = ( @@ -1136,7 +1136,7 @@ /turf/floor/tiled, /area/icarus/open) "dU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dV" = ( @@ -1145,7 +1145,7 @@ /turf/floor/tiled, /area/icarus/open) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/abstract/landmark/allowed_leak, @@ -1204,41 +1204,41 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eh" = ( /obj/random/tank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ei" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ej" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ek" = ( @@ -1246,38 +1246,38 @@ /turf/floor/tiled, /area/icarus/open) "el" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "em" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "en" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ep" = ( /obj/structure/filing_cabinet/tall, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "er" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled, /area/icarus/open) @@ -1290,7 +1290,7 @@ /area/icarus/open) "eu" = ( /obj/item/clothing/mask/smokable/cigarette/killthroat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ev" = ( @@ -1298,9 +1298,9 @@ /turf/floor/tiled, /area/icarus/open) "ew" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/breath/emergency, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -1314,394 +1314,394 @@ /turf/floor/tiled, /area/icarus/open) "ez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "eA" = ( /turf/floor/plating/airless/broken, /area/icarus/open) "eB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/scalpel, /turf/unsimulated/floor/sand, /area/icarus/open) "eC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bedsheet/orange, /turf/unsimulated/floor/sand, /area/icarus/open) "eE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "eG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/surgical, /turf/unsimulated/floor/sand, /area/icarus/open) "eH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/utensil/knife, /turf/unsimulated/floor/sand, /area/icarus/open) "eK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/padded, /turf/unsimulated/floor/sand, /area/icarus/open) "eL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair{ dir = 1 }, /turf/unsimulated/floor/sand, /area/icarus/open) "eP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pill_bottle/antibiotics, /turf/unsimulated/floor/sand, /area/icarus/open) "fb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bag/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ff" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/cans/waterbottle, /turf/unsimulated/floor/sand, /area/icarus/open) "fi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fs" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ft" = ( /obj/effect/icarus/irradiate, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "fx" = ( @@ -1714,13 +1714,13 @@ /turf/floor/tiled, /area/icarus/open) "fz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fB" = ( @@ -1736,10 +1736,10 @@ /turf/floor/tiled, /area/icarus/vessel) "fE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fF" = ( @@ -1747,12 +1747,12 @@ /turf/floor/plating, /area/icarus/vessel) "fG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -1904,10 +1904,10 @@ /turf/floor/plating, /area/icarus/vessel) "gj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -1931,7 +1931,7 @@ /turf/floor/plating, /area/icarus/vessel) "go" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/plating, /area/icarus/vessel) "gp" = ( @@ -2478,7 +2478,7 @@ /area/icarus/vessel) "hW" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hX" = ( @@ -2487,8 +2487,8 @@ /area/icarus/open) "hY" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hZ" = ( @@ -2505,17 +2505,17 @@ /area/icarus/vessel) "ib" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ic" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "id" = ( @@ -2525,52 +2525,52 @@ /turf/wall/r_wall, /area/icarus/open) "ie" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "if" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ig" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "ih" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/vehicle/train/cargo/trolley, /turf/unsimulated/floor/sand, /area/icarus/open) "ii" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ij" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/engine{ anchored = 0 }, @@ -2578,28 +2578,28 @@ /area/icarus/open) "ik" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "il" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "im" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -2608,8 +2608,8 @@ /turf/floor/grass/wild, /area/icarus/open) "ip" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "jb" = ( @@ -2654,7 +2654,7 @@ pixel_y = 2 }, /obj/random/soap, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "rK" = ( diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index 394879619f2b..57e1757f4eb2 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -27,7 +27,7 @@ /turf/floor/plating, /area/icarus/vessel) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aj" = ( @@ -45,7 +45,7 @@ /area/icarus/vessel) "am" = ( /obj/item/stack/material/ore/slag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "an" = ( @@ -86,13 +86,13 @@ /turf/floor/tiled, /area/icarus/vessel) "au" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled, /area/icarus/vessel) "av" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aw" = ( @@ -122,7 +122,7 @@ /turf/floor/tiled, /area/icarus/vessel) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/icarus, /turf/floor/tiled, /area/icarus/vessel) @@ -143,7 +143,7 @@ /area/icarus/vessel) "aG" = ( /obj/random/loot, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aH" = ( @@ -462,7 +462,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -585,7 +585,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -635,7 +635,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -678,7 +678,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -781,8 +781,8 @@ /turf/floor/tiled, /area/icarus/vessel) "cF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1054,7 +1054,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1114,7 +1114,7 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( @@ -1176,7 +1176,7 @@ /turf/wall, /area/icarus/open) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1209,7 +1209,7 @@ /turf/floor/tiled, /area/icarus/open) "dP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dQ" = ( @@ -1249,7 +1249,7 @@ /turf/floor/tiled, /area/icarus/open) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1285,9 +1285,9 @@ /turf/floor/plating, /area/icarus/open) "ed" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( @@ -1296,8 +1296,8 @@ /turf/floor/tiled, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eg" = ( diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 0892ba4c827a..ee7d49c6be8d 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -1,14 +1,12 @@ -var/global/datum/matchmaker/matchmaker = new() - -/hook/roundstart/proc/matchmaking() - matchmaker.do_matchmaking() - return TRUE +/decl/modpack/matchmaking/on_roundstart() + do_matchmaking() -/datum/matchmaker/matchmaker/New() +// It doesn't really matter when this registers during init as long as it's before roundstart. +/decl/modpack/matchmaking/post_initialize() . = ..() events_repository.register_global(/decl/observ/player_latejoin, src, PROC_REF(matchmake_latejoiner)) -/datum/matchmaker/proc/matchmake_latejoiner(mob/living/character, datum/job/job) +/decl/modpack/matchmaking/proc/matchmake_latejoiner(mob/living/character, datum/job/job) if(character.mind && character.client?.prefs.relations.len) for(var/T in character.client.prefs.relations) var/TT = relation_types[T] @@ -30,17 +28,17 @@ var/global/datum/matchmaker/matchmaker = new() QDEL_NULL_LIST(known_connections) . = ..() -/datum/matchmaker +/decl/modpack/matchmaking var/list/relation_types = list() var/list/relations = list() -/datum/matchmaker/New() - ..() +/decl/modpack/matchmaking/Initialize() + . = ..() for(var/T in subtypesof(/datum/relation/)) var/datum/relation/R = T relation_types[initial(R.name)] = T -/datum/matchmaker/proc/do_matchmaking() +/decl/modpack/matchmaking/proc/do_matchmaking() var/list/to_warn = list() for(var/datum/relation/R in relations) if(R.other) @@ -51,13 +49,13 @@ var/global/datum/matchmaker/matchmaker = new() for(var/mob/M in to_warn) to_chat(M,"You have new connections. Use \"See Relationship Info\" to view and finalize them.") -/datum/matchmaker/proc/get_relationships(datum/mind/M, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships(datum/mind/M, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == M && R.other && (R.finalized || !finalized_only)) . += R -/datum/matchmaker/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == holder && R.other && R.other.holder == target && (R.finalized || !finalized_only)) @@ -68,6 +66,7 @@ var/global/datum/matchmaker/matchmaker = new() return if(!source.mind || !user.mind || source.name != source.real_name) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL if(!length(matchmaker.get_relationships_between(user.mind, source.mind, TRUE))) return return "
You know them. More...
" @@ -89,10 +88,12 @@ var/global/datum/matchmaker/matchmaker = new() ..() if(!can_connect_to) can_connect_to = list(type) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations += src /datum/relation/proc/get_candidates() .= list() + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/R in matchmaker.relations) if(!valid_candidate(R.holder) || !can_connect(R)) continue @@ -112,6 +113,7 @@ var/global/datum/matchmaker/matchmaker = new() return TRUE /datum/relation/proc/can_connect(var/datum/relation/R) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/D in matchmaker.relations) //have to check all connections between us and them if(D.holder == R.holder && D.other && D.other.holder == holder) if(D.type in incompatible) @@ -141,6 +143,7 @@ var/global/datum/matchmaker/matchmaker = new() to_chat(holder.current,"Your connection with [other.holder] is no more.") to_chat(other.holder.current,"Your connection with [holder] is no more.") other.other = null + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations -= other matchmaker.relations -= src qdel(other) @@ -187,6 +190,7 @@ var/global/datum/matchmaker/matchmaker = new() set desc = "See what connections between people you know of." set category = "IC" + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) var/list/dat = list() var/editable = 0 @@ -221,6 +225,7 @@ var/global/datum/matchmaker/matchmaker = new() /mob/living/proc/see_relationship_info_with(var/mob/living/other) if(!other.mind) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind,other.mind,TRUE) var/list/dat = list("

[other]

") if(mind.gen_relations_info) @@ -268,11 +273,12 @@ var/global/datum/matchmaker/matchmaker = new() var/ok = "Close anyway" ok = alert("HEY! You have some non-finalized relationships. You can terminate them if they do not fit your character, or edit the info tidbit that the other party is given. THIS IS YOUR ONLY CHANCE to do so - after you close the window, they won't be editable.","Finalize relationships","Return to edit", "Close anyway") if(ok == "Close anyway") + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) for(var/datum/relation/R in relations) R.finalize() - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") else - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") return TOPIC_HANDLED return ..() \ No newline at end of file diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index 7bf5f2f680d3..df5544cffe15 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -17,6 +17,7 @@ #include "items\_items.dm" #include "items\brain.dm" #include "items\cerebro_enhancers.dm" +#include "items\clothing.dm" #include "items\coffee_cup.dm" #include "items\foundation_implanter.dm" #include "items\foundation_labcoat.dm" diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 5d4da1a87759..d00ab6c5c979 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -17,7 +17,7 @@ name = "Special Role - Paramount Grandmaster" head = /obj/item/clothing/head/helmet/space/psi_amp uniform = /obj/item/clothing/jumpsuit/psysuit - suit = /obj/item/clothing/suit/wizrobe/psypurple + suit = /obj/item/clothing/suit/paramount shoes = /obj/item/clothing/shoes/jackboots back = /obj/item/backpack/satchel gloves = /obj/item/clothing/gloves/grey diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index c19db16e091e..1bc713de0eb3 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,6 +1,5 @@ /decl/material/liquid/crystal_agent/do_material_check(var/mob/living/M) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? /decl/material/nullglass : ..() + . = !!M.get_ability_handler(/datum/ability_handler/psionics) ? /decl/material/nullglass : ..() /decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) ..() @@ -13,15 +12,12 @@ required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) result_amount = 1 -// TODO: #if defined(GAMEMODE_PACK_CULT) && defined(GAMEMODE_PACK_WIZARD) -// once wizard is modpacked #ifdef GAMEMODE_PACK_CULT /decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) var/weakref/donor_ref = LAZYACCESS(blood_data, DATA_BLOOD_DONOR) var/mob/living/donor = donor_ref?.resolve() - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) + . = istype(donor) && !!donor.get_ability_handler(/datum/ability_handler/psionics) #endif /decl/chemical_reaction/synthesis/nullglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) diff --git a/mods/content/psionics/items/clothing.dm b/mods/content/psionics/items/clothing.dm new file mode 100644 index 000000000000..32e5786c2440 --- /dev/null +++ b/mods/content/psionics/items/clothing.dm @@ -0,0 +1,16 @@ +/obj/item/clothing/suit/paramount + name = "purple robes" + desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." + icon = 'icons/clothing/suits/wizard/psy.dmi' + gender = PLURAL + permeability_coefficient = 0.01 + armor = list( + ARMOR_MELEE = ARMOR_MELEE_RESISTANT, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_SMALL, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_MINOR, + ARMOR_RAD = ARMOR_RAD_MINOR + ) + siemens_coefficient = 0.8 \ No newline at end of file diff --git a/mods/content/standard_jobs/_standard_jobs.dm b/mods/content/standard_jobs/_standard_jobs.dm new file mode 100644 index 000000000000..f19759923d43 --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dm @@ -0,0 +1,2 @@ +/decl/modpack/standard_jobs + name = "Standard SS13 Jobs" diff --git a/mods/content/standard_jobs/_standard_jobs.dme b/mods/content/standard_jobs/_standard_jobs.dme new file mode 100644 index 000000000000..cbba09eacef5 --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dme @@ -0,0 +1,30 @@ +#ifndef MODPACK_STANDARD_JOBS +#define MODPACK_STANDARD_JOBS +// BEGIN_INCLUDE +#include "_standard_jobs.dm" +#include "departments\civilian.dm" +#include "departments\command.dm" +#include "departments\engineering.dm" +#include "departments\medical.dm" +#include "departments\miscellaneous.dm" +#include "departments\science.dm" +#include "departments\security.dm" +#include "departments\service.dm" +#include "departments\supply.dm" +#include "jobs\captain.dm" +#include "jobs\civilian.dm" +#include "jobs\engineering.dm" +#include "jobs\medical.dm" +#include "jobs\science.dm" +#include "jobs\security.dm" +#include "jobs\synthetics.dm" +#include "outfits\cargo.dm" +#include "outfits\civilian.dm" +#include "outfits\command.dm" +#include "outfits\engineering.dm" +#include "outfits\medical.dm" +#include "outfits\pda.dm" +#include "outfits\science.dm" +#include "outfits\security.dm" +// END_INCLUDE +#endif diff --git a/mods/content/standard_jobs/departments/civilian.dm b/mods/content/standard_jobs/departments/civilian.dm new file mode 100644 index 000000000000..3cda485f4bbe --- /dev/null +++ b/mods/content/standard_jobs/departments/civilian.dm @@ -0,0 +1,4 @@ +/decl/department/civilian + name = "Civilian" + display_priority = 1 + display_color = "#dddddd" diff --git a/mods/content/standard_jobs/departments/command.dm b/mods/content/standard_jobs/departments/command.dm new file mode 100644 index 000000000000..fa842fb881cb --- /dev/null +++ b/mods/content/standard_jobs/departments/command.dm @@ -0,0 +1,14 @@ +/decl/department/command + name = "Command" + colour = "#800080" + display_priority = 5 + display_color = "#ccccff" + +/obj/machinery/network/pager + department = /decl/department/command + +/decl/department/support + name = "Support" + announce_channel = "Command" + colour = "#800080" + display_color = "#87ceeb" diff --git a/mods/content/standard_jobs/departments/engineering.dm b/mods/content/standard_jobs/departments/engineering.dm new file mode 100644 index 000000000000..252b4de16a61 --- /dev/null +++ b/mods/content/standard_jobs/departments/engineering.dm @@ -0,0 +1,12 @@ +/decl/department/engineering + name = "Engineering" + announce_channel = "Engineering" + colour = "#ffa500" + display_priority = 4 + display_color = "#fff5cc" + +/obj/item/robot_module/engineering + associated_department = /decl/department/engineering + +/obj/machinery/network/pager/engineering + department = /decl/department/engineering diff --git a/mods/content/standard_jobs/departments/medical.dm b/mods/content/standard_jobs/departments/medical.dm new file mode 100644 index 000000000000..01506ddd5d47 --- /dev/null +++ b/mods/content/standard_jobs/departments/medical.dm @@ -0,0 +1,13 @@ +/decl/department/medical + name = "Medical" + goals = list(/datum/goal/department/medical_fatalities) + announce_channel = "Medical" + colour = "#008000" + display_priority = 2 + display_color = "#ffeef0" + +/obj/item/robot_module/medical + associated_department = /decl/department/medical + +/obj/machinery/network/pager/medical + department = /decl/department/medical diff --git a/mods/content/standard_jobs/departments/miscellaneous.dm b/mods/content/standard_jobs/departments/miscellaneous.dm new file mode 100644 index 000000000000..19149216fdbd --- /dev/null +++ b/mods/content/standard_jobs/departments/miscellaneous.dm @@ -0,0 +1,4 @@ +/decl/department/miscellaneous + name = "Misc" + display_priority = -1 + display_color = "#ccffcc" diff --git a/mods/content/standard_jobs/departments/science.dm b/mods/content/standard_jobs/departments/science.dm new file mode 100644 index 000000000000..47ebb9c21308 --- /dev/null +++ b/mods/content/standard_jobs/departments/science.dm @@ -0,0 +1,18 @@ +/decl/department/science + name = "Science" + goals = list(/datum/goal/department/extract_slime_cores) + announce_channel = "Science" + colour = "#a65ba6" + display_color = "#e79fff" + +/obj/item/robot_module/research + associated_department = /decl/department/science + +/obj/machinery/network/pager/science + department = /decl/department/science + +/decl/department/exploration + name = "Exploration" + announce_channel = "Exploration" + colour = "#68099e" + display_color = "#b784a7" diff --git a/mods/content/standard_jobs/departments/security.dm b/mods/content/standard_jobs/departments/security.dm new file mode 100644 index 000000000000..e758218721bd --- /dev/null +++ b/mods/content/standard_jobs/departments/security.dm @@ -0,0 +1,12 @@ +/decl/department/security + name = "Security" + announce_channel = "Security" + colour = "#dd0000" + display_priority = 3 + display_color = "#ffddf0" + +/obj/item/robot_module/security + associated_department = /decl/department/security + +/obj/machinery/network/pager/security + department = /decl/department/security diff --git a/mods/content/standard_jobs/departments/service.dm b/mods/content/standard_jobs/departments/service.dm new file mode 100644 index 000000000000..b82c1c6deaf2 --- /dev/null +++ b/mods/content/standard_jobs/departments/service.dm @@ -0,0 +1,6 @@ + +/decl/department/service + name = "Service" + announce_channel = "Service" + colour = "#88b764" + display_color = "#d0f0c0" diff --git a/mods/content/standard_jobs/departments/supply.dm b/mods/content/standard_jobs/departments/supply.dm new file mode 100644 index 000000000000..c71d4327554b --- /dev/null +++ b/mods/content/standard_jobs/departments/supply.dm @@ -0,0 +1,8 @@ +/decl/department/supply + name = "Supply" + announce_channel = "Supply" + colour = "#bb9040" + display_color = "#f0e68c" + +/obj/machinery/network/pager/cargo + department = /decl/department/supply diff --git a/maps/exodus/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm similarity index 100% rename from maps/exodus/jobs/captain.dm rename to mods/content/standard_jobs/jobs/captain.dm diff --git a/maps/exodus/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm similarity index 98% rename from maps/exodus/jobs/civilian.dm rename to mods/content/standard_jobs/jobs/civilian.dm index 90d800d0b6bd..af71d84e5369 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -53,6 +53,11 @@ access_bar, access_kitchen ) + minimal_access = list( + access_hydroponics, + access_bar, + access_kitchen + ) minimal_access = list(access_bar) alt_titles = list("Barista") outfit_type = /decl/outfit/job/service/bartender diff --git a/maps/exodus/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm similarity index 100% rename from maps/exodus/jobs/engineering.dm rename to mods/content/standard_jobs/jobs/engineering.dm diff --git a/maps/exodus/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm similarity index 99% rename from maps/exodus/jobs/medical.dm rename to mods/content/standard_jobs/jobs/medical.dm index 4d37a277fa17..14e68446da0a 100644 --- a/maps/exodus/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -124,7 +124,6 @@ /datum/computer_file/program/camera_monitor ) skill_points = 22 - title = "Paramedic" event_categories = list(ASSIGNMENT_MEDICAL) /datum/job/chemist @@ -200,12 +199,14 @@ ) give_psionic_implant_on_join = FALSE +#ifdef MODPACK_PSIONICS /datum/job/counselor/equip_job(var/mob/living/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) return ..() +#endif // Department-flavor IDs /obj/item/card/id/medical diff --git a/maps/exodus/jobs/science.dm b/mods/content/standard_jobs/jobs/science.dm similarity index 100% rename from maps/exodus/jobs/science.dm rename to mods/content/standard_jobs/jobs/science.dm diff --git a/maps/exodus/jobs/security.dm b/mods/content/standard_jobs/jobs/security.dm similarity index 100% rename from maps/exodus/jobs/security.dm rename to mods/content/standard_jobs/jobs/security.dm diff --git a/maps/exodus/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm similarity index 100% rename from maps/exodus/jobs/synthetics.dm rename to mods/content/standard_jobs/jobs/synthetics.dm diff --git a/maps/exodus/outfits/cargo.dm b/mods/content/standard_jobs/outfits/cargo.dm similarity index 100% rename from maps/exodus/outfits/cargo.dm rename to mods/content/standard_jobs/outfits/cargo.dm diff --git a/maps/exodus/outfits/civilian.dm b/mods/content/standard_jobs/outfits/civilian.dm similarity index 100% rename from maps/exodus/outfits/civilian.dm rename to mods/content/standard_jobs/outfits/civilian.dm diff --git a/maps/exodus/outfits/command.dm b/mods/content/standard_jobs/outfits/command.dm similarity index 100% rename from maps/exodus/outfits/command.dm rename to mods/content/standard_jobs/outfits/command.dm diff --git a/maps/exodus/outfits/engineering.dm b/mods/content/standard_jobs/outfits/engineering.dm similarity index 100% rename from maps/exodus/outfits/engineering.dm rename to mods/content/standard_jobs/outfits/engineering.dm diff --git a/maps/exodus/outfits/medical.dm b/mods/content/standard_jobs/outfits/medical.dm similarity index 100% rename from maps/exodus/outfits/medical.dm rename to mods/content/standard_jobs/outfits/medical.dm diff --git a/maps/exodus/outfits/_pda.dm b/mods/content/standard_jobs/outfits/pda.dm similarity index 100% rename from maps/exodus/outfits/_pda.dm rename to mods/content/standard_jobs/outfits/pda.dm diff --git a/maps/exodus/outfits/science.dm b/mods/content/standard_jobs/outfits/science.dm similarity index 100% rename from maps/exodus/outfits/science.dm rename to mods/content/standard_jobs/outfits/science.dm diff --git a/maps/exodus/outfits/security.dm b/mods/content/standard_jobs/outfits/security.dm similarity index 100% rename from maps/exodus/outfits/security.dm rename to mods/content/standard_jobs/outfits/security.dm diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index bda33c4bf964..82d4e19aed59 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -1,10 +1,6 @@ #ifndef GAMEMODE_PACK_CULT #define GAMEMODE_PACK_CULT -#ifdef GAMEMODE_PACK_DEITY -#warn Deity modpack loaded before Cult modpack, Nar'sie godform will be unavailable! -#endif - // BEGIN_INCLUDE #include "_cult.dm" #include "archaeology.dm" @@ -25,7 +21,6 @@ #include "special_role.dm" #include "structures.dm" #include "talisman.dm" -#include "wizard.dm" #include "cultify\de-cultify.dm" #include "cultify\defile.dm" #include "cultify\mob.dm" diff --git a/mods/gamemodes/cult/ghosttrap.dm b/mods/gamemodes/cult/ghosttrap.dm index 3e5d7452df6f..07faf87515f2 100644 --- a/mods/gamemodes/cult/ghosttrap.dm +++ b/mods/gamemodes/cult/ghosttrap.dm @@ -20,9 +20,3 @@ var/obj/item/soulstone/stone = new(get_turf(user)) stone.shade = new(stone) request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") - -#ifdef GAMEMODE_PACK_DEITY -/decl/ghosttrap/cult_shade/Initialize() - ban_checks |= /decl/special_role/godcultist - . = ..() -#endif \ No newline at end of file diff --git a/mods/gamemodes/cult/items.dm b/mods/gamemodes/cult/items.dm index 01a8555e665d..2b2e826617c7 100644 --- a/mods/gamemodes/cult/items.dm +++ b/mods/gamemodes/cult/items.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME -// separated into a proc so that deity can modify it +// separated into a proc so that modpacks can modify it /obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) return iscultist(user) @@ -21,9 +21,9 @@ affecting = GET_EXTERNAL_ORGAN(H, zone) if(affecting) - to_chat(user, "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!")) else - to_chat(user, "An unexplicable force rips through you, tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through you, tearing the sword from your grasp!")) //random amount of damage between half of the blade's force and the full force of the blade. var/force = get_attack_force(user) diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 874dc92049c7..2077c9f0b1e1 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -14,19 +14,6 @@ else playsound(src, 'sound/effects/ghost2.ogg', 10, 5) -/datum/trader/ship/unique/wizard/New() - possible_wanted_items |= list( - /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, - /obj/item/sword/cultblade = TRADER_THIS_TYPE, - /obj/item/clothing/head/culthood = TRADER_ALL, - /obj/item/clothing/suit/space/cult = TRADER_ALL, - /obj/item/clothing/suit/cultrobes = TRADER_ALL, - /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, - /obj/structure/cult = TRADER_SUBTYPES_ONLY, - /obj/structure/constructshell = TRADER_ALL - ) - ..() - /datum/trader/ship/clothingshop/hatglovesaccessories/New() possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index 11fd2e328ed3..161d225a6481 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -481,8 +481,8 @@ if(casters.len < 3) break //T.turf_animation('icons/effects/effects.dmi', "rune_sac") - victim.fire_stacks = max(2, victim.fire_stacks) - victim.IgniteMob() + victim.set_fire_intensity(max(2, victim.get_fire_intensity())) + victim.ignite_fire() var/dam_amt = 2 + length(casters) victim.take_organ_damage(dam_amt, dam_amt) // This is to speed up the process and also damage mobs that don't take damage from being on fire, e.g. borgs if(ishuman(victim)) @@ -505,10 +505,9 @@ to_chat(victim, SPAN_OCCULT("The Geometer of Blood claims your body.")) victim.dust() if(victim) - victim.ExtinguishMob() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect + victim.extinguish_fire() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect victim = null - /obj/effect/rune/drain cultname = "blood drain" strokes = 3 diff --git a/mods/gamemodes/cult/spells/construct.dm b/mods/gamemodes/cult/spells/construct.dm index a300bacacb2e..05c35c46785d 100644 --- a/mods/gamemodes/cult/spells/construct.dm +++ b/mods/gamemodes/cult/spells/construct.dm @@ -89,12 +89,12 @@ hud_state = "const_pylon" -/spell/aoe_turf/conjure/pylon/cast(list/targets) +/spell/aoe_turf/conjure/pylon/cast(list/targets, mob/user) ..() var/turf/spawn_place = pick(targets) for(var/obj/structure/cult/pylon/P in spawn_place.contents) if(P.isbroken) - P.repair(usr) + P.repair(user) continue return diff --git a/mods/gamemodes/cult/wizard.dm b/mods/gamemodes/cult/wizard.dm deleted file mode 100644 index b29fa023f65c..000000000000 --- a/mods/gamemodes/cult/wizard.dm +++ /dev/null @@ -1,47 +0,0 @@ -// #ifdef GAMEMODE_PACK_WIZARD -// todo: add wizard gamemode define check once it's modularized -/decl/modpack/cult/post_initialize() - . = ..() - global.artefact_feedback[/obj/structure/closet/wizard/souls] = "SS" - -/datum/spellbook/standard/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/datum/spellbook/druid/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/obj/structure/closet/wizard/souls - name = "Soul Shard Belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/WillContain() - return list( - /obj/item/contract/boon/wizard/artificer, - /obj/item/belt/soulstone/full, - ) - -/datum/storage/belt/soulstone - can_hold = list( - /obj/item/soulstone - ) - -/obj/item/belt/soulstone - name = "soul stone belt" - desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." - icon = 'icons/clothing/belt/soulstones.dmi' - storage = /datum/storage/belt/soulstone - -/obj/item/belt/soulstone/full/WillContain() - return list(/obj/item/soulstone = max(1, storage?.storage_slots)) - -/obj/item/contract/boon/wizard/artificer - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." - -/obj/item/magic_rock - material = /decl/material/solid/stone/cult - -/obj/item/summoning_stone - material = /decl/material/solid/stone/cult \ No newline at end of file diff --git a/mods/gamemodes/deity/_defines.dm b/mods/gamemodes/deity/_defines.dm deleted file mode 100644 index 99f85b14f61c..000000000000 --- a/mods/gamemodes/deity/_defines.dm +++ /dev/null @@ -1,19 +0,0 @@ -#define DEITY_TREE_SACRIFICE "Sacrificing" -#define DEITY_TREE_SOUL "Soul Arts" -#define DEITY_TREE_DARK_MINION "Summoning" -#define DEITY_TREE_TRANSMUTATION "Transmutation" -#define DEITY_TREE_CONJURATION "Conjuration" -#define DEITY_TREE_ARTIFACT "Artifacts" -#define DEITY_TREE_FIRECONJ "Fire Conjuration" -#define DEITY_TREE_HERALD "Phenomena" - -#define DEITY_BLOOD_CRAFT "Blood Crafting" -#define DEITY_ARMOR_CRAFT "Armor Crafting" -#define DEITY_VOID_CRAFT "Void Crafting" -#define DEITY_UNLOCK_ARMS "Unlock Armaments" -#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" - -#define isdeity(A) istype(A, /mob/living/deity) - -#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. -#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dm b/mods/gamemodes/deity/_deity.dm deleted file mode 100644 index 6c658e122b37..000000000000 --- a/mods/gamemodes/deity/_deity.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/deity - name = "Deity Gamemode Content" \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme deleted file mode 100644 index a1603dd317d8..000000000000 --- a/mods/gamemodes/deity/_deity.dme +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef GAMEMODE_PACK_DEITY -#define GAMEMODE_PACK_DEITY -// BEGIN_INCLUDE -#include "_defines.dm" -#include "_deity.dm" -#include "codex.dm" -#include "deity_base.dm" -#include "deity_role.dm" -#include "gamemode.dm" -#include "god_cultist_role.dm" -#include "overrides.dm" -#include "extensions\deity_be_near.dm" -#include "forms\forms.dm" -// These should only load if cult is loaded. -#ifdef GAMEMODE_PACK_CULT -#include "forms\narsie\items.dm" -#include "forms\narsie\narsie.dm" -#include "forms\narsie\structures.dm" -#include "forms\narsie\deity_items\basic.dm" -#include "forms\narsie\deity_items\minions.dm" -#include "forms\narsie\deity_items\sacrificing.dm" -#include "forms\narsie\deity_items\smithing.dm" -#include "forms\narsie\spells\tear_veil.dm" -#endif -#include "forms\starlight\items.dm" -#include "forms\starlight\mobs.dm" -#include "forms\starlight\starlight.dm" -#include "forms\starlight\structures.dm" -#include "forms\starlight\deity_items\artifacts.dm" -#include "forms\starlight\deity_items\phenomena.dm" -#include "forms\starlight\deity_items\spells.dm" -#include "forms\starlight\spells\disable_tech.dm" -#include "forms\starlight\spells\starlight_aura.dm" -#include "forms\starlight\spells\veil_of_shadows.dm" -#include "forms\tower\spells.dm" -#include "forms\tower\structures.dm" -#include "forms\tower\tower.dm" -#include "forms\tower\deity_items\conjuration.dm" -#include "forms\tower\deity_items\transmutation.dm" -#include "mobs\deity.dm" -#include "mobs\deity_boons.dm" -#include "mobs\deity_click.dm" -#include "mobs\deity_hud.dm" -#include "mobs\deity_items.dm" -#include "mobs\deity_phenomena.dm" -#include "mobs\deity_power.dm" -#include "mobs\deity_pylon.dm" -#include "mobs\deity_sources.dm" -#include "mobs\deity_Stat.dm" -#include "mobs\deity_topic.dm" -#include "mobs\deity_tracking.dm" -#include "mobs\say.dm" -#include "mobs\freelook\cultnet.dm" -#include "mobs\freelook\mask.dm" -#include "mobs\items\blood_crafting.dm" -#include "mobs\items\deity_item.dm" -#include "mobs\items\general.dm" -#include "mobs\items\generic.dm" -#include "mobs\menu\deity_nano.dm" -#include "mobs\phenomena\_defines.dm" -#include "mobs\phenomena\communication.dm" -#include "mobs\phenomena\conjuration.dm" -#include "mobs\phenomena\conversion.dm" -#include "mobs\phenomena\generic.dm" -#include "mobs\phenomena\narsie.dm" -#include "mobs\phenomena\phenomena.dm" -#include "mobs\phenomena\starlight.dm" -#include "mobs\phenomena\transmutation.dm" -#include "screen\intent.dm" -#include "spells\boon.dm" -#include "spells\construction.dm" -#include "spells\open_gateway.dm" -#include "spells\vision.dm" -#include "structures\altar.dm" -#include "structures\blood_forge.dm" -#include "structures\pylon.dm" -#include "structures\structures.dm" -#include "structures\trap.dm" -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm deleted file mode 100644 index fae5bfe607a3..000000000000 --- a/mods/gamemodes/deity/codex.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/codex_entry/deity - abstract_type = /datum/codex_entry/deity - -/datum/codex_entry/deity/altar - associated_paths = list(/obj/structure/deity/altar) - mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." - antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
" - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge - associated_paths = list(/obj/structure/deity/blood_forge) - antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." - disambiguator = "occult" - -/datum/codex_entry/deity/gateway - associated_paths = list(/obj/structure/deity/gateway) - antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." - disambiguator = "occult" - -/datum/codex_entry/deity/radiant_statue - associated_paths = list(/obj/structure/deity/radiant_statue) - antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge/starlight - associated_paths = list(/obj/structure/deity/blood_forge/starlight) - antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." - disambiguator = "occult" - -/datum/codex_entry/deity/wizard_recharger - associated_paths = list(/obj/structure/deity/wizard_recharger) - antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." - disambiguator = "occult" - -/datum/codex_entry/deity/pylon - associated_paths = list(/obj/structure/deity/pylon) - antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/deity_base.dm b/mods/gamemodes/deity/deity_base.dm deleted file mode 100644 index 0d7268ebd643..000000000000 --- a/mods/gamemodes/deity/deity_base.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/map_template/ruin/antag_spawn/deity - name = "Deity Base" - mappaths = list( - "mods/gamemodes/deity/deity_base.dmm" - ) - apc_test_exempt_areas = list( - /area/map_template/deity_spawn = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/deity_spawn - name = "\improper Deity Spawn" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE diff --git a/mods/gamemodes/deity/deity_base.dmm b/mods/gamemodes/deity/deity_base.dmm deleted file mode 100644 index 7e009c2d0bd7..000000000000 --- a/mods/gamemodes/deity/deity_base.dmm +++ /dev/null @@ -1,1035 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/space/infinity, -/area/map_template/deity_spawn) -"b" = ( -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"c" = ( -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) -"d" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"e" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(5,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(6,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(7,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(8,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(9,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(10,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(11,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(12,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(13,1,1) = {" -a -a -a -a -b -b -b -b -b -b -d -b -b -b -b -b -b -a -a -a -a -"} -(14,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(15,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(16,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(17,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(18,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(19,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(20,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(21,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(26,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(27,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(28,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(29,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(30,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(31,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(32,1,1) = {" -a -a -a -a -c -c -c -c -c -c -e -c -c -c -c -c -c -a -a -a -a -"} -(33,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(34,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(35,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(36,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(37,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(38,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(39,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(40,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(41,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(42,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(43,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(44,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/mods/gamemodes/deity/deity_role.dm b/mods/gamemodes/deity/deity_role.dm deleted file mode 100644 index 0426f6e8568e..000000000000 --- a/mods/gamemodes/deity/deity_role.dm +++ /dev/null @@ -1,15 +0,0 @@ -/decl/special_role/deity - name = "Deity" - name_plural = "Deities" - mob_path = /mob/living/deity - welcome_text = "This is not your world. This is not your reality. But here you exist. Use your powers, feed off the faith of others.
You have to click on yourself to choose your form.
Everything you say will be heard by your cultists!
To get points your cultists need to build!
Build Shrine and Construction are the best starting boons!" - landmark_id = "DeitySpawn" - - flags = ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB - - hard_cap = 2 - hard_cap_round = 2 - initial_spawn_req = 1 - initial_spawn_target = 1 - - base_to_load = "Deity Base" diff --git a/mods/gamemodes/deity/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm deleted file mode 100644 index 5eed3ae1fe40..000000000000 --- a/mods/gamemodes/deity/extensions/deity_be_near.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/extension/deity_be_near - base_type = /datum/extension/deity_be_near - expected_type = /obj/item - var/keep_away_instead = FALSE - var/mob/living/deity/connected_deity - var/threshold_base = 6 - var/expected_helmet - flags = EXTENSION_FLAG_IMMEDIATE - -/datum/extension/deity_be_near/New(var/datum/holder, var/mob/living/deity/connect) - ..() - events_repository.register(/decl/observ/moved, holder,src, PROC_REF(check_movement)) - connected_deity = connect - events_repository.register(/decl/observ/destroyed, holder, src, PROC_REF(dead_deity)) - var/obj/O = holder - O.desc += "
This item deals damage to its wielder the [keep_away_instead ? "closer" : "farther"] it is from a deity structure" - - -/datum/extension/deity_be_near/Destroy() - events_repository.unregister(/decl/observ/moved, holder,src) - events_repository.unregister(/decl/observ/destroyed, holder, src) - events_repository.unregister(/decl/observ/item_equipped, holder, src) - . = ..() - -/datum/extension/deity_be_near/proc/check_movement() - var/obj/item/I = holder - if(!isliving(I.loc)) - return - var/min_dist = INFINITY - for(var/s in connected_deity.structures) - var/dist = get_dist(holder,s) - if(dist < min_dist) - min_dist = dist - if(keep_away_instead && min_dist < threshold_base) - deal_damage(I.loc, round(threshold_base/min_dist)) - else if(min_dist > threshold_base) - deal_damage(I.loc, round(min_dist/threshold_base)) - - -/datum/extension/deity_be_near/proc/deal_damage(var/mob/living/victim, var/mult) - return - -/datum/extension/deity_be_near/proc/dead_deity() - var/obj/item/I = holder - I.visible_message(SPAN_WARNING("\The [holder]'s power fades!")) - qdel(src) - -/datum/extension/deity_be_near/proc/wearing_full() - var/obj/item/I = holder - - if(!ishuman(I.loc)) - return FALSE - var/mob/living/human/H = I.loc - if(H.get_equipped_slot_for_item(I) != slot_wear_suit_str) - return FALSE - if(expected_helmet && !istype(H.get_equipped_item(slot_head_str), expected_helmet)) - return FALSE - return TRUE - -/datum/extension/deity_be_near/champion/deal_damage(var/mob/living/victim,var/mult) - victim.take_damage(3 * mult, OXY) - -/datum/extension/deity_be_near/oracle/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(mult, BURN) - -/datum/extension/deity_be_near/traitor/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(5 * mult, PAIN) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/forms.dm b/mods/gamemodes/deity/forms/forms.dm deleted file mode 100644 index 6f1f2f135b30..000000000000 --- a/mods/gamemodes/deity/forms/forms.dm +++ /dev/null @@ -1,48 +0,0 @@ -/*A god form basically is a combination of a sprite sheet choice and a gameplay choice. -Each plays slightly different and has different challenges/benefits -*/ - -/datum/god_form - var/name = "Form" - var/info = "This is a form your being can take." - var/desc = "This is the mob's description given." - var/faction = MOB_FACTION_NEUTRAL //For stuff like mobs and shit - var/god_icon_state = "nar-sie" //What you look like - var/pylon_icon_state //What image shows up when appearing in a pylon - var/mob/living/deity/linked_god = null - var/starting_power_min = 10 - var/starting_regeneration = 1 - var/list/buildables = list() //Both a list of var changes and a list of buildables. - var/list/items - -/datum/god_form/New(var/mob/living/deity/D) - ..() - D.icon_state = god_icon_state - D.desc = desc - D.power_min = starting_power_min - D.power_per_regen = starting_regeneration - linked_god = D - if(items && items.len) - var/list/complete_items = list() - for(var/l in items) - var/datum/deity_item/di = new l() - complete_items[di.name] = di - D.set_items(complete_items) - items.Cut() - -// TODO: Make this not a thing. It's so bad. -/datum/god_form/proc/sync_structure(var/obj/O) - var/list/svars = buildables[O.type] - if(!svars) - return - for(var/V in svars) - O.vars[V] = svars[V] - -/datum/god_form/proc/take_charge(var/mob/living/user, var/charge) - return TRUE - -/datum/god_form/Destroy() - if(linked_god) - linked_god.form = null - linked_god = null - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm deleted file mode 100644 index 59e8a7d15865..000000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/datum/deity_item/boon/eternal_darkness - name = "Eternal Darkness" - desc = "Allows a follower to cause insanity in a target." - category = "Dark Spells" - base_cost = 40 - boon_path = /spell/targeted/shatter - -/datum/deity_item/boon/torment - name = "Torment" - desc = "Gives a follower the ability to cause mass hysteria and pain." - category = "Dark Spells" - base_cost = 50 - boon_path = /spell/targeted/torment - -/datum/deity_item/boon/blood_shard - name = "Blood Shard" - desc = "Lets a follower cause a target's blood to literally explode out of their skin into dangerous projectiles." - category = "Dark Spells" - base_cost = 75 - boon_path = /spell/hand/charges/blood_shard - -/datum/deity_item/boon/drain_blood - name = "Drain Blood" - desc = "Lets a follower drain blood from all those around them." - category = "Dark Spells" - base_cost = 110 - boon_path = /spell/aoe_turf/drain_blood - -/datum/deity_item/phenomenon/exude_blood - name = "Phenomenon: Exude Blood" - desc = "You extract the raw blood used in your faith and give it to one of your flock." - category = "Dark Spells" - base_cost = 30 - phenomenon_path = /datum/phenomenon/exude_blood \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm b/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm deleted file mode 100644 index be4c8fe14edc..000000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/deity_item/minions - name = DEITY_TREE_DARK_MINION - desc = "Unlock abilities that allow your followers to craft and summon useful creatures." - category = DEITY_TREE_DARK_MINION - base_cost = 75 - -/datum/deity_item/boon/soul_shard - name = "Soul Stone Shard" - desc = "Give your follower a sliver of soulstone to capture a life in." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 20 - boon_path = /obj/item/soulstone - -/datum/deity_item/boon/blood_zombie - name = "Blood Plague" - desc = "Give a vessel to a follower filled with infection so vile, it turns all sapient creatures into mindless husks." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 300 - boon_path = /obj/item/chems/drinks/zombiedrink - -/datum/deity_item/boon/tear_veil - name = "Tear Veil" - desc = "Grant your follower the ability to literally rip a hole in this reality, allowing things to pass through." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 100 - boon_path = /spell/tear_veil - -/datum/deity_item/phenomenon/hellscape - name = "Phenomenon: Reveal Hellscape" - desc = "You show a non-believer what their future will be like." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 110 - phenomenon_path = /datum/phenomenon/hellscape \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm deleted file mode 100644 index 7e5d631c7f93..000000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/deity_item/sacrifice - name = DEITY_TREE_SACRIFICE - desc = "Unlocks the tools necessary to allow your followers to sacrifice in your name." - category = DEITY_TREE_SACRIFICE - base_cost = 50 - max_level = 1 - -/datum/deity_item/boon/sac_dagger - name = "Sacrificial Dagger" - desc = "A small dagger embued with your powers. Lets your followers give you power through sacrifices on an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /obj/item/knife/ritual/sacrifice - -/datum/deity_item/boon/sac_spell - name = "Sacrifice Spell" - desc = "This ability makes the user take INCREDIBLE amounts of damage to heal a target for a similar amount of damage." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /spell/targeted/heal_target/sacrifice - -/datum/deity_item/boon/execution_axe - name = "Greedy Axe" - desc = "This axe can store the very souls of those it kills to be later transfered to you through an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - boon_path = /obj/item/bladed/axe/fire/cult - -/datum/deity_item/blood_stone - name = "Bloodied Stone" - desc = "Unlocks the blood stone building, which allows followers to increase your power through ritual and prayer." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - max_level = 1 - -/datum/deity_item/blood_stone/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= /obj/structure/deity/blood_stone \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm deleted file mode 100644 index bcb12ff11e34..000000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/deity_item/blood_crafting/narsie - recipes = list( - /obj/item/sword/cultblade = 50, - /obj/item/clothing/head/culthood/alt = 10, - /obj/item/clothing/suit/cultrobes/alt = 20 - ) - -/datum/deity_item/blood_crafting/armored - name = DEITY_ARMOR_CRAFT - desc = "Unlock the secrets to tempered blood smithing, allowing your followers to smith more powerful and expensive armaments." - category = DEITY_BLOOD_CRAFT - base_cost = 75 - requirements = list(DEITY_BLOOD_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70 - ) //also shield? - -/datum/deity_item/blood_crafting/space - name = DEITY_VOID_CRAFT - desc = "Allows your followers to craft space suits, allowing you to finally spread across the cosmos." - category = DEITY_BLOOD_CRAFT - base_cost = 100 - requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/space/cult = 100, - /obj/item/clothing/head/helmet/space/cult = 70 - ) //Probably more too. \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/items.dm b/mods/gamemodes/deity/forms/narsie/items.dm deleted file mode 100644 index 56d3ffe89f8f..000000000000 --- a/mods/gamemodes/deity/forms/narsie/items.dm +++ /dev/null @@ -1,77 +0,0 @@ - -//SACRIFICE DAGGER -//If used on a person on an altar, causes the user to carve into them, dealing moderate damage and gaining points for the altar's god. -/obj/item/knife/ritual/sacrifice - name = "sacrificial dagger" - desc = "This knife is dull but well used." - material = /decl/material/solid/stone/cult - -/obj/item/knife/ritual/sacrifice/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - var/turf/T = get_turf(a) - var/obj/structure/deity/altar/altar = locate() in T - if(!altar) - return ..() - if(isliving(a)) - var/mob/living/L = a - var/multiplier = 1 - if(L.mind) - multiplier++ - if(ishuman(L)) - var/mob/living/human/H = L - if(H.should_have_organ(BP_HEART)) - multiplier++ - if(L.stat == DEAD) - to_chat(user, SPAN_WARNING("\The [a] is already dead! There is nothing to take!")) - return - - user.visible_message(SPAN_WARNING("\The [user] hovers \the [src] over \the [a], whispering an incantation.")) - if(!do_after(user,200, L)) - return - user.visible_message(SPAN_DANGER("\The [user] plunges the knife down into \the [a]!")) - L.take_damage(20) - if(altar.linked_god) - altar.linked_god.adjust_power_min(2 * multiplier,0,"from a delicious sacrifice!") - - -//EXEC AXE -//If a person hit by this axe within three seconds dies, sucks in their soul to be harvested at altars. -/obj/item/bladed/axe/fire/cult - name = "terrible axe" - desc = "Its head is sharp and stained red with heavy use." - icon = 'icons/obj/items/weapon/bone_axe.dmi' - var/stored_power = 0 - -/obj/item/bladed/axe/fire/cult/examine(mob/user) - . = ..() - if(stored_power) - to_chat(user, SPAN_NOTICE("It exudes a death-like smell.")) - -/obj/item/bladed/axe/fire/cult/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - if(istype(a, /obj/structure/deity/altar)) - var/obj/structure/deity/altar/altar = a - if(stored_power && altar.linked_god) - altar.linked_god.adjust_power_min(stored_power, "from harvested souls.") - altar.visible_message(SPAN_WARNING("\The [altar] absorbs a black mist exuded from \the [src].")) - return - if(ismob(a)) - var/mob/M = a - if(M.stat != DEAD) - events_repository.register(/decl/observ/death, M,src, TYPE_PROC_REF(/obj/item/bladed/axe/fire/cult, gain_power)) - spawn(30) - events_repository.unregister(/decl/observ/death, M,src) - return ..() - -/obj/item/bladed/axe/fire/cult/proc/gain_power() - stored_power += 50 - src.visible_message(SPAN_OCCULT("\The [src] screeches as the smell of death fills the air!")) - -/obj/item/chems/drinks/zombiedrink - name = "well-used urn" - desc = "Said to bring those who drink it back to life, no matter the price." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "urn" - volume = 10 - amount_per_transfer_from_this = 10 - -/obj/item/chems/drinks/zombiedrink/populate_reagents() - add_to_reagents(/decl/material/liquid/zombie, reagents.maximum_volume) diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm deleted file mode 100644 index 8ebf2dfc818b..000000000000 --- a/mods/gamemodes/deity/forms/narsie/narsie.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/god_form/narsie - name = "Nar-Sie" - info = {"The Geometer of Blood, you crave blood and destruction.
- Benefits:
- +Can gain power from blood sacrifices.
- +Ability to forge weapons and armor.
- Drawbacks:
- -Servant abilities require copious amounts of their blood. - "} - desc = "A being made of a million nightmares, a billion deaths." - god_icon_state = "nar-sie" - pylon_icon_state = "shade" - faction = "cult" - - buildables = list( - /obj/structure/deity/altar/narsie, - /obj/structure/deity/pylon - ) - items = list( - /datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/eternal_darkness, - /datum/deity_item/boon/torment, - /datum/deity_item/boon/blood_shard, - /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomenon/exude_blood, - /datum/deity_item/sacrifice, - /datum/deity_item/boon/sac_dagger, - /datum/deity_item/boon/sac_spell, - /datum/deity_item/boon/execution_axe, - /datum/deity_item/blood_stone, - /datum/deity_item/minions, - /datum/deity_item/boon/soul_shard, - /datum/deity_item/boon/blood_zombie, - /datum/deity_item/boon/tear_veil, - /datum/deity_item/phenomenon/hellscape, - /datum/deity_item/blood_crafting/narsie, - /datum/deity_item/blood_crafting/armored, - /datum/deity_item/blood_crafting/space - ) - -/datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) - charge = min(100, charge * 0.25) - if(prob(charge)) - to_chat(user, SPAN_WARNING("You feel drained...")) - var/mob/living/human/H = user - if(istype(H) && H.should_have_organ(BP_HEART)) - H.vessel.remove_any(charge) - else - user.take_damage(charge) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm deleted file mode 100644 index daf6b5d59d9d..000000000000 --- a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/tear_veil - name = "Tear Veil" - desc = "Use your mental strength to literally tear a hole from this dimension to the next, letting things through..." - - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_floor" - cast_sound = 'sound/effects/meteorimpact.ogg' - var/list/possible_spawns = list( - /mob/living/simple_animal/hostile/scarybat/cult, - /mob/living/simple_animal/hostile/creature/cult, - /mob/living/simple_animal/hostile/revenant/cult - ) - -/spell/tear_veil/choose_targets() - var/turf/T = get_turf(holder) - holder.visible_message(SPAN_NOTICE("A strange portal rips open underneath \the [holder]!")) - var/obj/effect/gateway/hole = new(get_turf(T)) - hole.density = FALSE - return list(hole) - -/spell/tear_veil/cast(var/list/targets, var/mob/holder, var/channel_count) - if(channel_count == 1) - return - var/type = pick(possible_spawns) - var/mob/living/L = new type(get_turf(targets[1])) - L.faction = holder.faction - L.visible_message(SPAN_WARNING("\A [L] escapes from the portal!")) - -/spell/tear_veil/after_spell(var/list/targets) - qdel(targets[1]) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm deleted file mode 100644 index af576963a1f0..000000000000 --- a/mods/gamemodes/deity/forms/narsie/structures.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/structure/deity/altar/narsie - name = "altar" - desc = "A small desk, covered in blood." - icon_state = "talismanaltar" - -//BLOODLETTING STRUCTURE -//A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. -/obj/structure/deity/blood_stone - name = "bloody stone" - desc = "A jagged stone covered in the various stages of blood, from dried to fresh." - icon_state = "blood_stone" - // TODO: material-based health for deity structures - current_health = 100 //It's a piece of rock. - build_cost = 700 - -/obj/structure/deity/blood_stone/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/mob/living/human/H = user - user.visible_message( - SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smearing their blood over the black stone."), - SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smearing your blood over its smooth surface.") - ) - while(do_after(H, 5 SECONDS, src)) - user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) - if(H.should_have_organ(BP_HEART)) - H.drip(5, get_turf(src)) - else - H.take_damage(5) - linked_god.adjust_power_min(1, 1) - return TRUE - -/datum/codex_entry/deity/blood_stone - associated_paths = list(/obj/structure/deity/blood_stone) - antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm b/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm deleted file mode 100644 index 286be5afd10f..000000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/deity_item/boon/blazing_blade - name = "Blazing Blade" - desc = "A divine blade of burning fury. If it stays too far away from an altar of some sort, it disappears." - base_cost = 250 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/sword/blazing - -/datum/deity_item/boon/holy_beacon - name = "Holy Beacon" - desc = "A staff capable of producing an almost harmless bolt of sunlight, capable of blinding anyone in the room, at least for a while." - base_cost = 200 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/gun/energy/staff/beacon - -/datum/deity_item/boon/black_death - name = "Black Death" - desc = "A small dagger capable of poisoning those it bites. Careful, if it loses all its charges, it will burn the user. It can be recharged at a radiant statue." - base_cost = 150 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/knife/ritual/shadow - -/datum/deity_item/blood_crafting/firecrafting - name = "Fire Crafting" - desc = "Gain the ability for your minions to build smithing stations that can make many rings of power." - base_cost = 300 - category = DEITY_TREE_ARTIFACT - max_level = 1 - forge_type = /obj/structure/deity/blood_forge/starlight - recipes = list(/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling = 70 - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm b/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm deleted file mode 100644 index 37f830d27cbe..000000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/deity_item/phenomenon/herald - name = "Choose Herald" - desc = "Gives you the ability to choose a herald. Can only be used once so be careful." - phenomenon_path = /datum/phenomenon/herald - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/wisp - name = "Summon Wisp" - desc = "Manipulate around a small light." - phenomenon_path = /datum/phenomenon/movable_object/wisp - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/flickering_whisper - name = "Flickering Whisper" - desc = "Send a subtle message to a non-follower, and see what they see for a while." - phenomenon_path = /datum/phenomenon/flickering_whisper - base_cost = 50 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/burning_glare - name = "Burning Glare" - desc = "Use your divine power to physically burn a person." - phenomenon_path = /datum/phenomenon/burning_glare - base_cost = 200 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/open_gateway - name = "Open Gateway" - desc = "Unlocks the ability to open a gateway. Required for rebirth." - phenomenon_path = /datum/phenomenon/create_gateway - base_cost = 250 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomenon/divine_right - name = "Divine Right" - desc = "Unlocks the ability to possess your Herald, permanently transforming you into a physical god." - phenomenon_path = /datum/phenomenon/divine_right - base_cost = 300 - category = DEITY_TREE_HERALD \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm b/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm deleted file mode 100644 index 33c6e19a55a5..000000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/deity_item/boon/starburst - name = "Starburst" - desc = "Grant your minion the power to blind non-followers nearby." - base_cost = 60 - boon_path = /spell/targeted/genetic/blind/starburst - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/exchange_wounds - name = "Exchange Wounds" - desc = "Allow a follower to sacrifice their own well-being for that of those around them." - base_cost = 120 - boon_path = /spell/aoe_turf/exchange_wounds - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/radiant_aura - name = "Radiant Aura" - desc = "This spell makes one of your followers immune to laser fire, for a short while at least." - base_cost = 70 - boon_path = /spell/radiant_aura/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_touch - name = "Burning Touch" - desc = "Sets your minion's hand aflame, allowing them to burn people with an ever-increasing flame." - base_cost = 60 - boon_path = /spell/targeted/equip_item/burning_hand - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_grip - name = "Burning Grip" - desc = "Give your follower the ability to burn an item in someone's hand so badly it causes them to burn." - base_cost = 50 - boon_path = /spell/hand/burning_grip - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/blood_boil - name = "Blood Boil" - desc = "Allow a follower to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - base_cost = 90 - boon_path = /spell/targeted/blood_boil - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/fireball - name = "Fireball" - desc = "A classic spell, grants your follower the ability to throw an exploding ball of flame in any direction." - base_cost = 100 - boon_path = /spell/targeted/projectile/dumbfire/fireball - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/emp - name = "Disable Machinery" - desc = "Gives your follower a spell of disabling machinery, and mechanical hearts." - base_cost = 110 - boon_path = /spell/aoe_turf/disable_tech/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/cure_light - name = "Cure Light Wounds" - desc = "Grant mercy on your followers, giving them the ability to heal themselves slightly." - base_cost = 70 - boon_path = /spell/targeted/heal_target - category = DEITY_TREE_FIRECONJ \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/items.dm b/mods/gamemodes/deity/forms/starlight/items.dm deleted file mode 100644 index 31645b2d3acd..000000000000 --- a/mods/gamemodes/deity/forms/starlight/items.dm +++ /dev/null @@ -1,159 +0,0 @@ -/obj/item/clothing/gloves/ring/aura_ring - var/obj/aura/granted_aura - -/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) - ..() - if(granted_aura && slot == slot_gloves_str) - L.add_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) - ..() - if(granted_aura) - L.remove_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/Destroy() - QDEL_NULL(granted_aura) - . = ..() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn - name = "Talisman of the Starborn" - desc = "This ring seems to shine with more light than is put on it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_star.dmi' - material = /decl/material/solid/metal/blackbronze - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn/Initialize() - . = ..() - granted_aura = new /obj/aura/starborn() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged - name = "Talisman of the Blueforged" - desc = "The gem on this ring is quite peculiar..." - icon = 'icons/clothing/accessories/jewelry/rings/ring_blue.dmi' - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged/Initialize() - . = ..() - granted_aura = new /obj/aura/blueforge_aura() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling - name = "Talisman of the Shadowling" - desc = "If you weren't looking at this, you probably wouldn't have noticed it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_shadow.dmi' - material = /decl/material/solid/metal/blackbronze - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling/Initialize() - . = ..() - granted_aura = new /obj/aura/shadowling_aura() - -/obj/item/clothing/suit/armor/sunsuit - name = "knight's armor" - desc = "Now, you can be the knight in shining armor you've always wanted to be. With complementary sun insignia." - icon = 'icons/clothing/suits/deity/star_champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/head/helmet/sunhelm - name = "knight's helm" - desc = "It's a shiny metal helmet. It looks ripped straight out of the Dark Ages, actually." - icon = 'icons/clothing/head/star_champion.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/armor/sunrobe - name = "oracle's robe" - desc = "The robes of a priest. One that praises the sun, apparently. Well, it certainly reflects light well." - icon = 'icons/clothing/suits/deity/star_oracle.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/suit/armor/sunrobe/Initialize() - . = ..() - set_light(4, 0.3) - -/obj/item/clothing/suit/space/shadowsuit - name = "traitor's cloak" - desc = "There is absolutely nothing visible through the fabric. The shadows stick to your skin when you touch it." - item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT - min_pressure_protection = 0 - icon = 'icons/clothing/suits/deity/star_traitor.dmi' - -/obj/item/clothing/head/helmet/space/shadowhood - name = "traitor's hood" - desc = "No light can pierce this hood. It's unsettling." - icon = 'icons/clothing/head/star_traitor.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/knife/ritual/shadow - name = "black death" - desc = "An obsidian dagger. The singed remains of a green cloth are wrapped around the 'handle.'" - var/charge = 5 - -/obj/item/knife/ritual/shadow/apply_hit_effect(var/mob/living/target, var/mob/living/user, var/hit_zone) - . = ..() - if(charge) - if(target.get_damage(BRUTE) > 15) - var/datum/reagents/R = target.reagents - if(!R) - return - R.add_reagent(/decl/material/liquid/venom, 5) - new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "fire_goon") - charge-- - else - user.take_damage(5, BURN) - if(prob(5)) - to_chat(user, SPAN_WARNING("\The [src] appears to be out of power!")) - new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "fire_goon") - -/obj/item/gun/energy/staff/beacon - name = "holy beacon" - desc = "Look closely into its crystal; there's a miniature sun. Or maybe that's just some fancy LEDs. Either way, it looks thoroughly mystical." - icon = 'icons/obj/wizard.dmi' - icon_state = "starstaff" - self_recharge = 0 - max_shots = 10 - projectile_type = /obj/item/projectile/energy/flash - required_antag_type = /decl/special_role/godcultist - -/obj/item/sword/blazing - name = "blazing blade" - icon = 'icons/obj/items/weapon/swords/flaming.dmi' - atom_damage_type = BURN - material_alteration = MAT_FLAG_ALTERATION_NONE - var/last_near_structure = 0 - var/mob/living/deity/linked - -/obj/item/sword/blazing/Initialize(var/maploading, var/material, var/deity) - . = ..() - START_PROCESSING(SSobj, src) - linked = deity - -/obj/item/sword/blazing/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/sword/blazing/Process() - if(!linked || last_near_structure + 10 SECONDS > world.time) - return - - if(linked.near_structure(src,1)) - if(last_near_structure < world.time - 30 SECONDS) - to_chat(loc, SPAN_NOTICE("\The [src] surges with power anew!")) - last_near_structure = world.time - else - if(last_near_structure < world.time - 30 SECONDS) //If it has been at least 30 seconds. - if(prob(5)) - to_chat(loc, SPAN_WARNING("\The [src] begins to fade, its power dimming this far away from a shrine.")) - else if(last_near_structure + 1800 < world.time) - visible_message(SPAN_WARNING("\The [src] disintegrates into a pile of ash!")) - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) diff --git a/mods/gamemodes/deity/forms/starlight/mobs.dm b/mods/gamemodes/deity/forms/starlight/mobs.dm deleted file mode 100644 index 5748cf2e2f40..000000000000 --- a/mods/gamemodes/deity/forms/starlight/mobs.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/starlight_soul - name = "soul" - desc = "A captured soul." - anchored = TRUE - butchery_data = null - -/mob/living/starlight_soul/Initialize(var/maploading, var/mob/living/old_mob) - . = ..() - if(old_mob) - name = old_mob.real_name - -/mob/living/starlight_soul/proc/set_deity(var/mob/living/deity/deity) - var/mob/observer/eye/freelook/cult/eye - if(eyeobj) - eye = eyeobj - eyeobj.release(src) - else - eye = new(src) - eye.suffix = "Soul" - eyeobj = eye - eye.visualnet = deity.eyenet - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(src.mind,1,"lost soul of [deity]", "You have been captured by \the [deity]! You now can only see into your own reality through the same rips and tears it uses. Your only chance at another body will be one in your captor's image...",specific_god=deity) - eyeobj.possess(src) - -/mob/living/starlight_soul/Destroy() - if(eyeobj) - QDEL_NULL(eyeobj) - . = ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm deleted file mode 100644 index f6462ae33fed..000000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm +++ /dev/null @@ -1,4 +0,0 @@ -/spell/aoe_turf/disable_tech/starlight - hidden_from_codex = TRUE - charge_max = 600 - spell_flags = 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm deleted file mode 100644 index 8ad867e41b3e..000000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/radiant_aura/starlight - name = "Starlight Aura" - desc = "This spell makes you immune to laser fire, for a short while at least." - spell_flags = 0 - charge_max = 400 diff --git a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm deleted file mode 100644 index e47edecd0822..000000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm +++ /dev/null @@ -1,57 +0,0 @@ -/spell/veil_of_shadows - name = "Veil of Shadows" - desc = "Become intangable, invisible. Like a ghost." - charge_max = 400 - invocation_type = SpI_EMOTE - invocation = "flickers out of existance" - school = "Divine" - spell_flags = 0 - duration = 100 - var/timer_id - var/light_steps = 4 - - hud_state = "wiz_statue" - -/spell/veil_of_shadows/choose_targets() - if(!timer_id && ishuman(holder)) - return list(holder) - . = null - -/spell/veil_of_shadows/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = user - H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) - if(H.add_cloaking_source(src)) - H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) - events_repository.register(/decl/observ/moved, H,src,PROC_REF(check_light)) - timer_id = addtimer(CALLBACK(src,PROC_REF(cancel_veil)),duration, TIMER_STOPPABLE) - -/spell/veil_of_shadows/proc/cancel_veil() - var/mob/living/human/H = holder - H.RemoveMovementHandler(/datum/movement_handler/mob/incorporeal) - deltimer(timer_id) - timer_id = null - var/turf/T = get_turf(H) - if(T.get_lumcount() > 0.1) //If we're somewhere somewhat shadowy we can stay invis as long as we stand still - drop_cloak() - else - events_repository.unregister(/decl/observ/moved, H,src) - events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) - -/spell/veil_of_shadows/proc/drop_cloak() - var/mob/living/human/H = holder - if(H.remove_cloaking_source(src)) - H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) - events_repository.unregister(/decl/observ/moved, H,src) - -/spell/veil_of_shadows/proc/check_light() - if(light_steps) - light_steps-- - return - light_steps = initial(light_steps) - for(var/obj/machinery/light/light in view(1,holder)) - light.flicker(20) - -/spell/veil_of_shadows/Destroy() - deltimer(timer_id) - cancel_veil() - .= ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/starlight.dm b/mods/gamemodes/deity/forms/starlight/starlight.dm deleted file mode 100644 index 1469947fe10a..000000000000 --- a/mods/gamemodes/deity/forms/starlight/starlight.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/god_form/starlight - name = "Starlight Herald" - info = {"Sun and fire incarnate.
- Benefits:
- +Ability to summon powerful minions via sacrifices.
- +Bless one of your minions as a Herald, giving them species powers and armor.
- Drawbacks:
- -Servant's powers will burn them.
- -You require copious amounts of power regeneration.
- "} - desc = "The bringer of life, and all that entails." - god_icon_state = "sungod" - pylon_icon_state = "god" - faction = "herald" - - buildables = list(/obj/structure/deity/altar/starlight, - /obj/structure/deity/pylon/starlight, - /obj/structure/deity/radiant_statue, - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/blazing_blade, - /datum/deity_item/boon/holy_beacon, - /datum/deity_item/boon/black_death, - /datum/deity_item/blood_crafting/firecrafting, - /datum/deity_item/boon/starburst, - /datum/deity_item/boon/exchange_wounds, - /datum/deity_item/boon/radiant_aura, - /datum/deity_item/boon/burning_touch, - /datum/deity_item/boon/burning_grip, - /datum/deity_item/boon/blood_boil, - /datum/deity_item/boon/emp, - /datum/deity_item/boon/cure_light, - /datum/deity_item/phenomenon/herald, - /datum/deity_item/phenomenon/wisp, - /datum/deity_item/phenomenon/flickering_whisper, - /datum/deity_item/phenomenon/burning_glare, - /datum/deity_item/phenomenon/open_gateway, - /datum/deity_item/phenomenon/divine_right - ) - -/datum/god_form/starlight/take_charge(var/mob/living/user, var/charge) - charge = max(5, charge/100) - if(prob(charge)) - to_chat(user, SPAN_DANGER("Your body burns!")) - user.take_damage(charge, BURN) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm deleted file mode 100644 index 7134d19ce481..000000000000 --- a/mods/gamemodes/deity/forms/starlight/structures.dm +++ /dev/null @@ -1,272 +0,0 @@ -/obj/structure/deity/altar/starlight - icon_state = "altarcandle" - -/obj/structure/deity/pylon/starlight - name = "sun pylon" - desc = "A miniature sun, floating ontop of a small pillar." - icon_state = "star_pylon" - -/obj/structure/deity/gateway - name = "gateway" - desc = "A gateway into the unknown." - icon = 'icons/obj/singularity.dmi' - icon_state = "singularity_s1" - power_adjustment = 1 - density = FALSE - var/weakref/target_ref - var/start_time = 0 - var/power_drain = 7 - var/looking_for - var/static/list/possible_forms = list( - "Starborn" = list( - "description" = "A species of hardy fire-wreathed soldiers.", - "message" = "As a Starborn, you are immune to laser-fire. You are a hardy soldier, able to take on the greatest of foes.", - "species" = "Starborn" - ), - "Blueforged" = list( - "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", - "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", - "species" = "Blueforged", - "spells" = list( - /spell/targeted/ethereal_jaunt, - /spell/targeted/shatter, - /spell/hand/burning_grip, - /spell/aoe_turf/disable_tech, - /spell/targeted/projectile/magic_missile, - /spell/open_gateway - ) - ), - "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch.", - "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", - "species" = "Shadow", - "spells" = list( - /spell/veil_of_shadows, - /spell/targeted/subjugation, - /spell/targeted/projectile/magic_missile - ) - ) - ) - -/obj/structure/deity/gateway/Initialize() - . = ..() - if(linked_god) - linked_god.power_per_regen -= power_drain - START_PROCESSING(SSobj, src) - -/obj/structure/deity/gateway/Process() - if(!linked_god) - return - if(linked_god.power <= 0) - to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) - qdel(src) - return - var/mob/living/human/target - if(target_ref) - target = target_ref.resolve() - if(target) - if(get_turf(target) != get_turf(src)) - target = null - target_ref = null - start_time = 0 - return - else if(prob(5)) - to_chat(target,SPAN_DANGER("\The [src] sucks at your lifeforce!")) - if(start_time && world.time > start_time + 300) - start_time = 0 - to_chat(target,SPAN_DANGER("You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.")) - var/mob/living/starlight_soul/ss = new(get_turf(linked_god),target) - if(target.mind) - target.mind.transfer_to(ss) - else - ss.ckey = target.ckey - ss.set_deity(linked_god) - target.dust() - if(power_drain >= 3) - linked_god.power_per_regen += 3 - power_drain -= 3 - else - //Get new target - var/mob/living/human/T = locate() in get_turf(src) - if(T) - target_ref = weakref(T) - start_time = world.time - to_chat(T, SPAN_DANGER("You feel your lifeforce begin to drain into \the [src]!")) - -/obj/structure/deity/gateway/Destroy() - linked_god.power_per_regen += power_drain - . = ..() - -/obj/structure/deity/gateway/attack_deity(var/mob/living/deity/deity) - var/list/html = list() - html += "

Servant List

" - html += "
Select a minion type to summon
" - html += "" - for(var/a in possible_forms) - var/list/form = possible_forms[a] - html += "" - html += "
NameDescription
[a][form["description"]]
" - show_browser(linked_god, jointext(html, null), "window=gateway") - -/obj/structure/deity/gateway/CanUseTopic(var/mob/user) - if(linked_god && (user == linked_god || user.loc == linked_god.loc)) - return STATUS_INTERACTIVE - return STATUS_CLOSE - -/obj/structure/deity/gateway/proc/stop_looking_for(var/successful) - if(looking_for) - if(!successful) - to_chat(linked_god, SPAN_WARNING("\The [src] did not find any [looking_for]. You may try again if you wish.")) - looking_for = null - -/obj/structure/deity/gateway/OnTopic(var/mob/user, var/list/href_list) - if(href_list["accept"] && istype(user,/mob/living/starlight_soul)) - if(href_list["accept"] != looking_for) - return TOPIC_HANDLED - var/mob/living/human/H = new(get_turf(src)) - user.mind.transfer_to(H) - H.set_species(possible_forms[looking_for]["species"]) - for(var/s in possible_forms[looking_for]["spells"]) - var/spell/S = new s - H.add_spell(S) - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(H.mind, 1, "[looking_for] of [linked_god]", "You are a powerful entity in the service to \the [linked_god]. [possible_forms[looking_for]["species"]]", specific_god = linked_god) - stop_looking_for(TRUE) - - return TOPIC_HANDLED - if(href_list["spawn_type"] && user == linked_god) - if(looking_for) - to_chat(usr, SPAN_WARNING("\The [src] is already looking for a [looking_for].")) - else - looking_for = href_list["spawn_type"] - to_chat(usr, SPAN_NOTICE("\The [src] is now looking for a [looking_for].")) - for(var/l in get_turf(linked_god)) - if(istype(l, /mob/living/starlight_soul)) - to_chat(l, "\The [src] is looking for a soul to become a [looking_for]. Accept? (Yes)") - addtimer(CALLBACK(src, PROC_REF(stop_looking_for), FALSE), 30 SECONDS) - show_browser(linked_god, null, "window=gateway") - return TOPIC_HANDLED - -/obj/structure/deity/radiant_statue - name = "radiant statue" - icon_state = "statue" - build_cost = 750 - power_adjustment = 1 - deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT|DEITY_STRUCTURE_ALONE - var/charge = 0 - var/charging = 0 //Charging, dispersing, etc. - -/obj/structure/deity/radiant_statue/on_update_icon() - ..() - if(charging) - icon_state = "statue_charging" - else if(charge) - icon_state = "statue_active" - else - icon_state = "statue" - -/obj/structure/deity/radiant_statue/Destroy() - if(charging) - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/deity/radiant_statue/proc/get_followers_nearby() - . = list() - if(linked_god) - for(var/m in linked_god.minions) - var/datum/mind/M = m - if(get_dist(M.current, src) <= 3) - . += M.current - -/obj/structure/deity/radiant_statue/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O,/datum/extension/deity_be_near)) - if(activate_charging()) - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling your master's power course through you.")) - else - to_chat(L, SPAN_WARNING("\The [src] has already been activated.")) - else - to_chat(L, SPAN_WARNING("\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.")) - return TRUE - -/obj/structure/deity/radiant_statue/attack_deity(var/mob/living/deity/deity) - if(activate_charging()) - to_chat(deity,SPAN_NOTICE("You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.")) - else - to_chat(deity,SPAN_WARNING("\The [src] is either already activated, or there are no followers nearby to charge it.")) - -/obj/structure/deity/radiant_statue/proc/activate_charging() - var/list/followers = get_followers_nearby() - if(is_processing || !followers.len) - return 0 - charging = 1 - START_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] hums, activating.")) - update_icon() - return 1 - -/obj/structure/deity/radiant_statue/attackby(var/obj/item/I, var/mob/user) - if(charging && (istype(I, /obj/item/knife/ritual/shadow) || istype(I, /obj/item/gun/energy/staff/beacon)) && charge_item(I, user)) - return - ..() - -/obj/structure/deity/radiant_statue/proc/charge_item(var/obj/item/I, var/mob/user) - . = 0 - if(istype(I, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy = I - var/obj/item/cell/power_supply = energy.get_cell() - if(power_supply) - power_supply.give(energy.charge_cost * energy.max_shots) - . = 1 - else if(istype(I ,/obj/item/knife/ritual/shadow)) - var/obj/item/knife/ritual/shadow/shad = I - shad.charge = initial(shad.charge) - . = 1 - if(.) - to_chat(user, SPAN_NOTICE("\The [src]'s glow envelops \the [I], restoring it to proper use.")) - charge -= 1 - -/obj/structure/deity/radiant_statue/Process() - if(charging) - charge++ - var/list/followers = get_followers_nearby() - if(followers.len == 0) - stop_charging() - return - - if(charge == 40) - src.visible_message(SPAN_NOTICE("\The [src] lights up, pulsing with energy.")) - charging = 0 - update_icon() - else - charge -= 0.5 - var/list/followers = get_followers_nearby() - if(followers.len) - for(var/m in followers) - var/mob/living/L = m - L.heal_damage(BURN, 5) - if(prob(5)) - to_chat(L, SPAN_NOTICE("You feel a pleasant warmth spread throughout your body...")) - for(var/s in L.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - if(charge == 0) - stop_charging() - -/obj/structure/deity/radiant_statue/proc/stop_charging() - STOP_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] powers down, returning to its dormant form.")) - charging = 0 - update_icon() - -/obj/structure/deity/blood_forge/starlight - name = "radiant forge" - desc = "a swath of heat and fire permeats from this forge." - recipe_feat_list = "Fire Crafting" - text_modifications = list( - "Cost" = "Burn", - "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", - "Out" = "flames" - ) diff --git a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm b/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm deleted file mode 100644 index 0d6f820540ba..000000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm +++ /dev/null @@ -1,107 +0,0 @@ -/datum/deity_item/conjuration - name = DEITY_TREE_CONJURATION - desc = "Conjuration is the school of creation and teleportation, summoning fireballs or teleporting long distances, this school is extremely powerful." - category = DEITY_TREE_CONJURATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/create_air - name = "Create Air" - desc = "Allows your follower to generate a livable atmosphere in the area they are in." - base_cost = 25 - category = DEITY_TREE_CONJURATION - boon_path = /spell/create_air/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/acid_spray - name = "Acid Spray" - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - base_cost = 130 - category = DEITY_TREE_CONJURATION - boon_path = /spell/acid_spray/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/force_wall - name = "Force Wall" - desc = "A temporary invincible wall for followers to summon." - base_cost = 30 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/forcewall/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/phenomenon/dimensional_locker - name = "Phenomenon: Dimensional Locker" - desc = "Gain the ability to move a magical locker around. While it cannot move living things, you can move it around as you please, even disappearing it into the nether." - base_cost = 50 - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/movable_object/dimensional_locker - requirements = list(DEITY_TREE_CONJURATION = 1) - -//Level 2 -/datum/deity_item/boon/single_charge/faithful_hound - name = "Faithful Hound" - desc = "This spell allows a follower to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - base_cost = 40 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/faithful_hound/tower - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/wizard_armaments - name = DEITY_UNLOCK_ARMS - desc = "Unlock spells related to the summoning of weapons and armor. These spells only last a short duration, but are extremely effective." - base_cost = 25 - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/boon/single_charge/sword - name = "Summon Sword" - desc = "This spell allows your followers to summon a golden firey sword for a short duration." - base_cost = 50 - boon_path = /spell/targeted/equip_item/dyrnwyn/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/boon/single_charge/shield - name = "Summon Shield" - desc = "This spell allows your followers to summon a magical shield for a short duration." - base_cost = 20 - boon_path = /spell/targeted/equip_item/shield/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/phenomenon/portals - name = "Phenomenon: Portals" - desc = "Gain the ability to create portals for your followers to enter through. You will need to create two for it work. Any created past that will delete the oldest portal." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 2) - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/portals - -//Level 3 -/datum/deity_item/boon/single_charge/fireball - name = "Fireball" - desc = "Embue your follower with the power of exploding fire." - base_cost = 85 - boon_path = /spell/targeted/projectile/dumbfire/fireball/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/boon/single_charge/force_portal - name = "Force Portal" - desc = "This spell allows a follower to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - base_cost = 45 - boon_path = /spell/aoe_turf/conjure/force_portal/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/phenomenon/banishing_smite - name = "Phenomenon: Banishing Smite" - desc = "Gain the ability to smite an individual, dealing damage to them. If they are weakened enough, this can cause them to temporarily be transported." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 3) - category = DEITY_TREE_CONJURATION - phenomenon_path = /datum/phenomenon/banishing_smite \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm b/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm deleted file mode 100644 index 5eb1dd34785c..000000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/deity_item/transmutation - name = DEITY_TREE_TRANSMUTATION - desc = "Transmutation is the school of change. It cannot be used to create things, only modify them or even destroy them." - category = DEITY_TREE_TRANSMUTATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/slippery_surface - name = "Slippery Surface" - desc = "Allows a follower to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/hand/slippery_surface/tower - -/datum/deity_item/boon/single_charge/smoke - name = "Smoke" - desc = "Allows a follower to distill the nearby air into smoke." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/smoke/tower - -//Level 2 -/datum/deity_item/boon/single_charge/knock - name = "Knock" - desc = "Allows a follower to open nearby doors without the keys." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/knock/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/boon/single_charge/burning_grip - name = "Burning Grip" - desc = "Allows a follower cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - base_cost = 15 - boon_path = /spell/hand/burning_grip/tower - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/phenomenon/warp_body - name = "Phenomenon: Warp Body" - desc = "Gain the ability to warp the very structure of a target's body, wracking pain and weakness." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - phenomenon_path = /datum/phenomenon/warp - -//Level 3 -/datum/deity_item/boon/single_charge/jaunt - name = "Ethereal Jaunt" - desc = "Allows a follower to liquify for a short duration, letting them pass through all dense objects." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/targeted/ethereal_jaunt/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/healing_spells - name = DEITY_UNLOCK_HEAL - desc = "Of transmutation, healing is perhaps the most immediately effective and useful. This unlocks the healing spells for your followers." - base_cost = 50 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/boon/single_charge/heal - name = "Minor Heal" - desc = "Allows your follower to heal themselves, or others, for a slight amount." - base_cost = 15 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/tower - -/datum/deity_item/boon/single_charge/heal/major - name = "Major Heal" - desc = "Allows your follower to heal others for a great amount." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/major/tower - -/datum/deity_item/boon/single_charge/heal/area - name = "Area Heal" - desc = "Allows your follower to heal everyone in an area for minor damage." - base_cost = 20 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/area/tower - -/datum/deity_item/phenomenon/rock_form - name = "Phenomenon: Rock Form" - desc = "Gain the ability to transform your followers into beings of rock and stone." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - phenomenon_path = /datum/phenomenon/rock_form \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/spells.dm b/mods/gamemodes/deity/forms/tower/spells.dm deleted file mode 100644 index 18b88647edfe..000000000000 --- a/mods/gamemodes/deity/forms/tower/spells.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/create_air/tower - desc = "Allows you to generate a livable atmosphere in the area you are in." - charge_max = 5 - -/spell/hand/burning_grip/tower - desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - charge_max = 3 - -/spell/hand/slippery_surface/tower - desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - charge_max = 2 - -/spell/aoe_turf/knock/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/smoke/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/conjure/faithful_hound/tower - desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - charge_max = 1 - spell_flags = 0 - -/spell/aoe_turf/conjure/force_portal/tower - desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - charge_max = 2 - spell_flags = 0 - -/spell/acid_spray/tower - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - charge_max = 2 - -/spell/targeted/heal_target/tower - desc = "Allows you to heal yourself, or others, for a slight amount." - charge_max = 2 - -/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - desc = "Allows you to heal others for a great amount." - -/spell/targeted/heal_target/area/tower - desc = "Allows you to heal everyone in an area for minor damage." - charge_max = 1 - -/spell/targeted/ethereal_jaunt/tower - desc = "Allows you to liquefy for a short duration, letting you pass through all dense objects." - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER - -/spell/aoe_turf/conjure/forcewall/tower - desc = "A temporary invincible wall for you to summon." - charge_max = 3 - -/spell/targeted/equip_item/dyrnwyn/tower - desc = "This spell allows you to summon a fiery golden sword for a short duration." - charge_max = 1 - -/spell/targeted/equip_item/shield/tower - desc = "This spell allows you to summon a magical shield for a short duration." - charge_max = 1 - -/spell/targeted/projectile/dumbfire/fireball/tower - desc = "Imbue yourself with the power of exploding fire." - charge_max = 2 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/structures.dm b/mods/gamemodes/deity/forms/tower/structures.dm deleted file mode 100644 index 453caf22de25..000000000000 --- a/mods/gamemodes/deity/forms/tower/structures.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/structure/deity/altar/tower - icon_state = "tomealtar" - -/obj/structure/deity/wizard_recharger - name = "fountain of power" - desc = "Refreshing, cool water surrounded by archaic carvings." - icon_state = "fountain" - power_adjustment = 2 - build_cost = 700 - -/obj/structure/deity/wizard_recharger/attack_hand(var/mob/hitter) - SHOULD_CALL_PARENT(FALSE) - if(!length(hitter.mind?.learned_spells)) - to_chat(hitter, SPAN_WARNING("You don't feel as if this will do anything for you.")) - return TRUE - - hitter.visible_message(SPAN_NOTICE("\The [hitter] dips their hands into \the [src], a soft glow emanating from them.")) - if(do_after(hitter,300,src,check_holding=0)) - for(var/s in hitter.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - to_chat(hitter, SPAN_NOTICE("You feel refreshed!")) - else - to_chat(hitter, SPAN_WARNING("You need to keep in contact with \the [src]!")) - return TRUE \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/tower.dm b/mods/gamemodes/deity/forms/tower/tower.dm deleted file mode 100644 index 37f63bce440e..000000000000 --- a/mods/gamemodes/deity/forms/tower/tower.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/god_form/wizard - name = "The Tower" - info = {"Only from destruction does the Tower grow. Its bricks smelted from crumbled ignorance and the fires of ambition.
- Benefits:
- +Learn spells from two different schools.
- +Deity gains power through each spell use.

- Drawbacks:
- -Abilities hold a limited amount of charge and must be charged at a fountain of power. - "} - desc = "A single solitary tower" - god_icon_state = "tower" - pylon_icon_state = "nim" - - buildables = list(/obj/structure/deity/altar/tower, - /obj/structure/deity/pylon, - /obj/structure/deity/wizard_recharger - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/conjuration, - /datum/deity_item/boon/single_charge/create_air, - /datum/deity_item/boon/single_charge/acid_spray, - /datum/deity_item/boon/single_charge/force_wall, - /datum/deity_item/phenomenon/dimensional_locker, - /datum/deity_item/boon/single_charge/faithful_hound, - /datum/deity_item/wizard_armaments, - /datum/deity_item/boon/single_charge/sword, - /datum/deity_item/boon/single_charge/shield, - /datum/deity_item/phenomenon/portals, - /datum/deity_item/boon/single_charge/fireball, - /datum/deity_item/boon/single_charge/force_portal, - /datum/deity_item/phenomenon/banishing_smite, - /datum/deity_item/transmutation, - /datum/deity_item/boon/single_charge/slippery_surface, - /datum/deity_item/boon/single_charge/smoke, - /datum/deity_item/boon/single_charge/knock, - /datum/deity_item/boon/single_charge/burning_grip, - /datum/deity_item/phenomenon/warp_body, - /datum/deity_item/boon/single_charge/jaunt, - /datum/deity_item/healing_spells, - /datum/deity_item/boon/single_charge/heal, - /datum/deity_item/boon/single_charge/heal/major, - /datum/deity_item/boon/single_charge/heal/area, - /datum/deity_item/phenomenon/rock_form - ) - -/datum/god_form/wizard/take_charge(var/mob/living/user, var/charge) - linked_god.adjust_power_min(max(round(charge/100), 1),silent = 1) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/gamemode.dm b/mods/gamemodes/deity/gamemode.dm deleted file mode 100644 index 9bf79d8ca875..000000000000 --- a/mods/gamemodes/deity/gamemode.dm +++ /dev/null @@ -1,12 +0,0 @@ -/decl/game_mode/godmode - name = "Deity" - round_description = "An otherworldly beast has turned its attention to you and your fellow cremembers." - extended_round_description = "The station has been infiltrated by a fanatical group of death-cultists! They will use powers from beyond your comprehension to subvert you to their cause and ultimately please their gods through sacrificial summons and physical immolation! Try to survive!" - uid = "god" - required_players = 10 - required_enemies = 3 - end_on_antag_death = FALSE - associated_antags = list( - /decl/special_role/deity, - /decl/special_role/godcultist - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/god_cultist_role.dm b/mods/gamemodes/deity/god_cultist_role.dm deleted file mode 100644 index d1c5bced882a..000000000000 --- a/mods/gamemodes/deity/god_cultist_role.dm +++ /dev/null @@ -1,106 +0,0 @@ -/decl/special_role/godcultist - name = "God Cultist" - name_plural = "God Cultists" - blacklisted_jobs = list(/datum/job/submap) - antag_indicator = "hudcultist" - faction_verb = /mob/living/proc/dpray - welcome_text = "You are under the guidance of a powerful otherwordly being. Spread its will and keep your faith.
Use dpray to communicate directly with your master!
Ask your master for spells to start building!" - flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE - hard_cap = 5 - hard_cap_round = 6 - initial_spawn_req = 3 - initial_spawn_target = 3 - antaghud_indicator = "hudcultist" - skill_setter = /datum/antag_skill_setter/station - blocked_job_event_categories = list(ASSIGNMENT_ROBOT, ASSIGNMENT_COMPUTER) - -/decl/special_role/godcultist/add_antagonist_mind(var/datum/mind/player, var/ignore_role, var/nonstandard_role_type, var/nonstandard_role_msg, var/mob/living/deity/specific_god) - if(!..()) - return 0 - - if(specific_god) - add_cultist(player, specific_god) - - return 1 - -/decl/special_role/godcultist/post_spawn() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(!deity.current_antagonists.len) - return - var/count = 1 - var/deity_count = 1 - while(count <= current_antagonists.len) - if(deity_count > deity.current_antagonists.len) - deity_count = 1 - var/datum/mind/deity_mind = deity.current_antagonists[deity_count] - var/datum/mind/mind = current_antagonists[count] - add_cultist(mind, deity_mind.current) - count++ - deity_count++ - - -/decl/special_role/godcultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) - var/mob/living/deity/god = get_deity(player) - if(!..()) - return 0 - remove_cultist(player, god) - return 1 - -/decl/special_role/godcultist/get_extra_panel_options(var/datum/mind/player) - return "\[Select Deity\]" - -/decl/special_role/godcultist/Topic(href, href_list) - if(..()) - return 1 - if(href_list["selectgod"]) - var/list/god_list = list() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(length(deity.current_antagonists)) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - god_list += mind.current - else - for(var/mob/living/deity/specific_deity in global.player_list) - god_list += specific_deity - if(god_list.len) - var/mob/living/deity/D = input(usr, "Select a deity for this cultist.") in null|god_list - if(D) - var/datum/mind/player = locate(href_list["selectgod"]) - remove_cultist(player) //Remove him from any current deity. - add_cultist(player, D) - log_and_message_admins("has set [key_name(player.current)] to be a minion of [key_name(D)]") - else - to_chat(usr, SPAN_WARNING("There are no deities to be linked to.")) - return 1 - -/decl/special_role/godcultist/proc/add_cultist(var/datum/mind/player, var/mob/living/deity/deity) - deity.add_follower(player.current) - player.current.add_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/remove_cultist(var/datum/mind/player, var/mob/living/deity/god) - god.remove_follower(player.current) - player.current.remove_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/get_deity(var/datum/mind/player) - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - var/mob/living/deity/god = mind.current - if(god && god.is_follower(player.current,1)) - return god - -/mob/living/proc/dpray(var/msg as text) - set category = "Abilities" - - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(!src.mind || !godcult.is_antagonist(mind)) - return - msg = sanitize(msg) - var/mob/living/deity/D = godcult.get_deity(mind) - if(!D || !msg) - return - - //Make em wait a few seconds. - src.visible_message("\The [src] bows their head down, muttering something.", SPAN_NOTICE("You send the message \"[msg]\" to your master.")) - to_chat(D, "\The [src] (J) prays, \"[msg]\"") - log_and_message_admins("dprayed, \"[msg]\" to \the [key_name(D)]") diff --git a/mods/gamemodes/deity/mobs/deity.dm b/mods/gamemodes/deity/mobs/deity.dm deleted file mode 100644 index 96fc8fb54da6..000000000000 --- a/mods/gamemodes/deity/mobs/deity.dm +++ /dev/null @@ -1,134 +0,0 @@ -/mob/living/deity - name = "shapeless creature" - desc = "A shape of otherworldly matter, not yet ready to be unleashed into this world." - icon = 'icons/mob/deity_big.dmi' - icon_state = "egg" - pixel_x = -128 - pixel_y = -128 - max_health = 100 - universal_understand = TRUE - mob_sort_value = 5 - is_spawnable_type = FALSE - butchery_data = null - - var/eye_type = /mob/observer/eye/freelook/cult - var/datum/visualnet/cultnet/eyenet - var/list/minions = list() //Minds of those who follow him - var/list/structures = list() //The objs that this dude controls. - var/list/feats = list() - var/datum/god_form/form - var/datum/current_boon - var/mob/living/following - -/mob/living/deity/Initialize() - . = ..() - eyenet = new() - eyeobj = new eye_type(get_turf(src), eyenet) - eyeobj.possess(src) - eyenet.add_source(src) - -/mob/living/deity/death(gibbed) - . = ..() - if(.) - for(var/m in minions) - var/datum/mind/M = m - remove_follower_spells(M) - to_chat(M.current, "Your connection has been severed! \The [src] is no more!") - sound_to(M.current, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(M.current, STAT_WEAK, 10) - for(var/s in structures) - var/obj/structure/deity/S = s - S.linked_god = null - -/mob/living/deity/shared_nano_interaction() - if(stat == DEAD) - return STATUS_CLOSE - return STATUS_INTERACTIVE - -/mob/living/deity/Destroy() - - for(var/phenomenon in phenomena) - remove_phenomenon(phenomenon) - - if(length(items_by_category)) - for(var/cat in items_by_category) - var/list/L = items_by_category[cat] - L.Cut() - items_by_category.Cut() - - if(length(items)) - for(var/i in items) - qdel(items[i]) - items.Cut() - - death() - if(length(minions)) - minions.Cut() - if(length(structures)) - structures.Cut() - - if(eyeobj) - eyeobj.release() - QDEL_NULL(eyeobj) - QDEL_NULL(eyenet) //We do it here as some mobs have eyes that have access to the visualnet and we only want to destroy it when the deity is destroyed - - QDEL_NULL(form) - - return ..() - -/mob/living/deity/verb/return_to_plane() - set category = "Godhood" - - eyeobj.forceMove(get_turf(src)) - -/mob/living/deity/verb/choose_form() - set name = "Choose Form" - set category = "Godhood" - - var/dat = list() - dat += {"

Choose a Form

- This choice is permanent. Choose carefully, but quickly. - - - - - - "} - var/list/forms = subtypesof(/datum/god_form) - - for(var/form in forms) - var/datum/god_form/god = form - var/god_name = initial(god.name) - var/icon/god_icon = icon('icons/mob/mob.dmi', initial(god.pylon_icon_state)) - send_rsc(src,god_icon, "[god_name].png") - dat += {" - - - - "} - dat += "
NameThemeDescription
[god_name][initial(god.info)]
" - show_browser(src, JOINTEXT(dat), "window=godform;can_close=0") - -/mob/living/deity/proc/set_form(var/type) - form = new type(src) - to_chat(src, SPAN_NOTICE("You undergo a transformation into your new form!")) - spawn(1) - SetName(form.name) - var/newname = sanitize(input(src, "Choose a name for your new form.", "Name change", form.name) as text, MAX_NAME_LEN) - if(newname) - fully_replace_character_name(newname) - src.verbs -= /mob/living/deity/verb/choose_form - show_browser(src, null, "window=godform") - for(var/m in minions) - var/datum/mind/mind = m - var/mob/living/L = mind.current - L.faction = form.faction - -//Gets the name based on form, or if there is no form name, type. -/mob/living/deity/proc/get_type_name(var/type) - if(form && form.buildables[type]) - var/list/vars = form.buildables[type] - if(vars["name"]) - return vars["name"] - var/atom/movable/M = type - return initial(M.name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_Stat.dm b/mods/gamemodes/deity/mobs/deity_Stat.dm deleted file mode 100644 index 6105b7f9af35..000000000000 --- a/mods/gamemodes/deity/mobs/deity_Stat.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/deity/Stat() - . = ..() - if(statpanel("Status")) - stat("Structure Num", structures.len) - stat("Minion Num", minions.len) - var/boon_name = "None" - if(current_boon) - if(istype(current_boon, /spell)) - var/spell/S = current_boon - boon_name = S.name - else - var/obj/O = current_boon - boon_name = O.name - stat("Current Boon",boon_name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_boons.dm b/mods/gamemodes/deity/mobs/deity_boons.dm deleted file mode 100644 index da05d9a5ff2b..000000000000 --- a/mods/gamemodes/deity/mobs/deity_boons.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob/living/deity/proc/set_boon(var/datum/boon) - if(current_boon) - qdel(current_boon) - current_boon = boon - to_chat(src, SPAN_NOTICE("You now have the boon [boon]")) - if(istype(boon, /atom/movable)) - var/atom/movable/A = boon - nano_data["boon_name"] = A.name - A.forceMove(src) - else if(istype(boon, /spell)) - var/spell/S = boon - nano_data["boon_name"] = S.name - -/mob/living/deity/proc/grant_boon(var/mob/living/L) - if(istype(current_boon, /spell) && !grant_spell(L, current_boon)) - return - else if(istype(current_boon, /obj/item)) - var/obj/item/I = current_boon - I.dropInto(L.loc) - var/origin_text = "on the floor" - if(L.equip_to_appropriate_slot(I)) - origin_text = "on your body" - else if(L.put_in_hands_or_del(I)) - origin_text = "in your hands" - else - var/obj/O = L.equip_to_storage(I) - if(O) - origin_text = "in \the [O]" - to_chat(L, SPAN_NOTICE("It appears [origin_text].")) - - to_chat(L, SPAN_OCCULT("\The [src] grants you a boon of [current_boon]!")) - to_chat(src, SPAN_NOTICE("You give \the [L] a boon of [current_boon].")) - log_and_message_admins("gave [key_name(L)] the boon [current_boon]") - current_boon = null - nano_data["boon_name"] = null - return - -/mob/living/deity/proc/grant_spell(var/mob/living/target, var/spell/spell) - var/datum/mind/M = target.mind - for(var/s in M.learned_spells) - var/spell/S = s - if(istype(S, spell.type)) - to_chat(src, SPAN_WARNING("They already know that spell!")) - return 0 - target.add_spell(spell) - spell.set_connected_god(src) - to_chat(target, SPAN_NOTICE("You feel a surge of power as you learn the art of [current_boon].")) - return 1 - -/* This is a generic proc used by the God to enact a sacrifice from somebody. Power is a value of magnitude. -*/ -/mob/living/deity/proc/take_charge(var/mob/living/L, var/power) - if(form) - form.take_charge(L, power) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_click.dm b/mods/gamemodes/deity/mobs/deity_click.dm deleted file mode 100644 index aae71fd6257d..000000000000 --- a/mods/gamemodes/deity/mobs/deity_click.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/deity/ClickOn(var/atom/A, var/params) - if(A == src) - if(form) - ui_interact(src) - else - choose_form() - return - var/list/modifiers = params2list(params) - if(modifiers["shift"] || modifiers["ctrl"]) - if(silenced) - to_chat(src, SPAN_WARNING("You cannot do that as you are silenced!")) - else - var/datum/phenomenon/phenomenon = get_phenomenon(modifiers["shift"], modifiers["ctrl"]) - if(phenomenon) - phenomenon.Click(A) - return - if(current_boon && is_follower(A)) - grant_boon(A) - else if(istype(A, /obj/structure/deity)) - var/obj/structure/deity/D = A - if(D.linked_god == src) - D.attack_deity(src) - return - ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_hud.dm b/mods/gamemodes/deity/mobs/deity_hud.dm deleted file mode 100644 index 12824de99040..000000000000 --- a/mods/gamemodes/deity/mobs/deity_hud.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity - hud_used = /datum/hud/deity - -/datum/hud/deity/FinalizeInstantiation() - action_intent = new /obj/screen/intent/deity(null, mymob) - adding += action_intent - ..() - var/obj/screen/intent/deity/D = action_intent - D.sync_to_mob(mymob) diff --git a/mods/gamemodes/deity/mobs/deity_items.dm b/mods/gamemodes/deity/mobs/deity_items.dm deleted file mode 100644 index 3dfa6e4dc642..000000000000 --- a/mods/gamemodes/deity/mobs/deity_items.dm +++ /dev/null @@ -1,33 +0,0 @@ -/mob/living/deity - var/list/items - var/list/items_by_category - -/mob/living/deity/proc/set_items(var/list/_items) - items = _items - items_by_category = list() - for(var/i in items) - var/datum/deity_item/di = items[i] - if(!items_by_category[di.category]) - items_by_category[di.category] = list() - items_by_category[di.category] += di - -/mob/living/deity/proc/has_item(var/name, var/minimum_level = 1) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - . = di.level >= minimum_level - -/mob/living/deity/proc/upgrade_item(var/name) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - if(!di.can_buy(src)) - return FALSE - di.buy(src) - . = TRUE - -/mob/living/deity/proc/get_item_level(var/name) - . = 0 - if(items[name]) - var/datum/deity_item/di = items[name] - . = di.level diff --git a/mods/gamemodes/deity/mobs/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm deleted file mode 100644 index a5abe64946a2..000000000000 --- a/mods/gamemodes/deity/mobs/deity_phenomena.dm +++ /dev/null @@ -1,94 +0,0 @@ -/mob/living/deity - var/silenced = 0 - var/list/phenomena = list() - var/list/intent_phenomena = list() - var/static/list/control_types = list("control", "controlshift", "shift") - - -/mob/living/deity/Initialize() - . = ..() - for(var/decl/intent/intent as anything in decls_repository.get_decls_of_type_unassociated(/decl/intent)) //Just in case we somehow remove/add a new intent #futureproofing - populate_intent(intent) - set_phenomenon(add_phenomenon(/datum/phenomenon/communicate), GET_DECL(/decl/intent/disarm), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/punish), GET_DECL(/decl/intent/help), "control") - set_phenomenon(add_phenomenon(/datum/phenomenon/point), GET_DECL(/decl/intent/help), "controlshift") - set_phenomenon(add_phenomenon(/datum/phenomenon/conversion), GET_DECL(/decl/intent/grab), "shift") - set_phenomenon(add_phenomenon(/datum/phenomenon/forced_conversion), GET_DECL(/decl/intent/grab), "control") - -/mob/living/deity/proc/silence(amount) - if(!silenced) - to_chat(src, SPAN_WARNING("You've been silenced! Your phenomena are disabled!")) - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.color = "#ff0000" - silenced += amount - for(var/phenom in phenomena) //Also make it so that you don't do cooldowns. - var/datum/phenomenon/P = phenomena[phenom] - if(P.refresh_time) - P.refresh_time += amount - -/mob/living/deity/handle_regular_status_updates() - . = ..() - if(.) - if(silenced > 0) - silenced-- - if(!silenced) - to_chat(src, SPAN_NOTICE("You are no longer silenced.")) - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.color = null - if(power_per_regen < 0 || power < power_min) - adjust_power(power_per_regen) - -/mob/living/deity/proc/add_phenomenon(phenomena_type) - LAZYINITLIST(phenomena) - for(var/P in phenomena) - if(istype(phenomena[P], phenomena_type)) - return - var/datum/phenomenon/P = new phenomena_type(src) - phenomena[P.name] = P - return P - -/mob/living/deity/proc/remove_phenomena_from_intent(decl/intent/intent, modifier, update = 1) - var/list/intent_list = intent_phenomena[intent] - intent_list[modifier] = null - if(update) - update_phenomena_bindings() - -/mob/living/deity/proc/remove_phenomenon(to_remove) - var/datum/phenomenon/P = phenomena[to_remove] - phenomena -= to_remove // this isn't going to work, is it? - for(var/intent in intent_phenomena) - var/list/intent_list = intent_phenomena[intent] - for(var/mod in intent_list) - if(intent_list[mod] == P) - intent_list[mod] = null - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() - update_phenomena() - update_phenomena_bindings() - if(selected == to_remove) - selected = null - qdel(P) - -/mob/living/deity/proc/populate_intent(decl/intent/intent) - LAZYDISTINCTADD(intent_phenomena[intent], control_types) - -/mob/living/deity/proc/set_phenomenon(datum/phenomenon/phenomenon, decl/intent/intent, modifiers) - if(!LAZYACCESS(intent_phenomena, intent)) - populate_intent(intent) - var/list/intent_list = intent_phenomena[intent] - intent_list[modifiers] = phenomenon - -/mob/living/deity/proc/get_phenomenon(shift = 0, control = 0) - var/list/intent_list = intent_phenomena[get_intent()] - if(intent_list) - var/type = "" - if(shift) - type = "shift" - if(control) - type = "control[type]" - if(intent_list[type]) - return intent_list[type] - return null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_power.dm b/mods/gamemodes/deity/mobs/deity_power.dm deleted file mode 100644 index ffe073b014a3..000000000000 --- a/mods/gamemodes/deity/mobs/deity_power.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/power = 0 - var/power_min = 10 - var/power_per_regen = 1 - -/mob/living/deity/proc/adjust_power(var/amount) - if(amount) - power = max(0, power + amount) - -/mob/living/deity/proc/adjust_power_min(var/amount, var/silent = 0, var/msg) - if(amount) - power_min = max(initial(power_min), power_min + amount) - if(!silent) - var/feel = "" - if(abs(amount) > 20) - feel = " immensely" - else if(abs(amount) > 10) - feel = " greatly" - if(abs(amount) >= 5) - var/class = amount > 0 ? "notice" : "warning" - to_chat(src, "You feel your power [amount > 0 ? "increase" : "decrease"][feel][msg ? " [msg]" : ""]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_pylon.dm b/mods/gamemodes/deity/mobs/deity_pylon.dm deleted file mode 100644 index 7f84dc5b339b..000000000000 --- a/mods/gamemodes/deity/mobs/deity_pylon.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/image/pylon_image - var/obj/structure/deity/pylon/pylon - -/mob/living/deity/set_form(var/type) - ..() - pylon_image = image('icons/mob/mob.dmi', icon_state = form.pylon_icon_state) - pylon_image.alpha = 180 - -/mob/living/deity/proc/possess_pylon(var/obj/structure/deity/pylon/P) - if(pylon) - leave_pylon() - pylon = P - pylon.overlays += pylon_image - playsound(pylon,'sound/effects/phasein.ogg',40,1) - -/mob/living/deity/proc/leave_pylon() - if(!pylon) - return - pylon.overlays -= pylon_image - pylon = null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_sources.dm b/mods/gamemodes/deity/mobs/deity_sources.dm deleted file mode 100644 index a1ec947983d8..000000000000 --- a/mods/gamemodes/deity/mobs/deity_sources.dm +++ /dev/null @@ -1,84 +0,0 @@ -/mob/living/deity/proc/add_follower(var/mob/living/L) - if(is_follower(L, silent=1)) - return - - adjust_source(3, L) - minions += L.mind - var/spell/construction/C = new() - L.add_spell(C) - C.set_connected_god(src) - if(form) - L.faction = form.faction - update_followers() - events_repository.register(/decl/observ/destroyed, L,src, PROC_REF(dead_follower)) - events_repository.register(/decl/observ/death, L,src, PROC_REF(update_followers)) - -/mob/living/deity/proc/dead_follower(var/mob/living/L) - events_repository.unregister(/decl/observ/death, L,src) - events_repository.unregister(/decl/observ/destroyed, L,src) - -/mob/living/deity/proc/remove_follower_spells(var/datum/mind/M) - if(M.learned_spells) - for(var/s in M.learned_spells) - var/spell/S = s - if(S.connected_god == src) - M.current.remove_spell(S) - qdel(S) - -/mob/living/deity/proc/remove_follower(var/mob/living/L) - if(!is_follower(L, silent=1)) - return - - adjust_source(-3, L) - minions -= L.mind - L.faction = MOB_FACTION_NEUTRAL - if(L.mind) - remove_follower_spells(L.mind) - update_followers() - - -/mob/living/deity/proc/adjust_source(var/amount, var/atom/source, var/silent = 0, var/msg) - adjust_power_min(amount, silent, msg) - if(!ismovable(source)) - return - if(amount > 0) - eyenet.add_source(source) - if(istype(source, /obj/structure/deity)) - structures |= source - else - eyenet.remove_source(source) - if(istype(source, /obj/structure/deity)) - structures -= source - -/mob/living/deity/proc/is_follower(var/mob/living/L, var/silent = 0) - if(istype(L)) - if(L.mind) - if(L.mind in minions) - return 1 - if(!silent) - to_chat(src, SPAN_WARNING("You do not feel a malleable mind behind that frame.")) - return 0 - -/mob/living/deity/fully_replace_character_name(var/new_name, var/in_depth = TRUE) - if(!..()) - return 0 - for(var/m in minions) - var/datum/mind/minion = m - to_chat(minion.current, "Your master is now known as [new_name].") - minion.assigned_special_role = "Servant of [new_name]" - eyeobj.SetName("[src] ([eyeobj.name_sufix])") - nano_data["name"] = new_name - return 1 - -//Whether we are near an important structure. -/mob/living/deity/proc/near_structure(var/atom/A, var/all_structures = 0) - var/turf/T = get_turf(A) - for(var/s in structures) - if(!all_structures) - var/obj/structure/deity/D = s - if(D.deity_flags & DEITY_STRUCTURE_NEAR_IMPORTANT)//If it needs to be near an important structure, it isn't important. - continue - - if(get_dist(T, s) <= 3) - return 1 - return 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_topic.dm b/mods/gamemodes/deity/mobs/deity_topic.dm deleted file mode 100644 index 4ff775043939..000000000000 --- a/mods/gamemodes/deity/mobs/deity_topic.dm +++ /dev/null @@ -1,56 +0,0 @@ -/mob/living/deity/OnSelfTopic(list/href_list) - if(href_list["form"]) - var/type = locate(href_list["form"]) in subtypesof(/datum/god_form) - if(type) - set_form(type) - return TOPIC_HANDLED - if(href_list["select_phenomenon"]) - nano_data["phenomenaMenu"] = 1 - selected = phenomena[href_list["select_phenomenon"]] - nano_data["selectedPhenomenaName"] = selected.name - return TOPIC_HANDLED - if(href_list["clear_selected"]) - nano_data["phenomenaMenu"] = 0 - selected = null - nano_data["selectedPhenomenaName"] = null - return TOPIC_HANDLED - if(href_list["select_intent"]) - var/decl/intent/intent = locate(href_list["select_intent"]) - if(!istype(intent)) - return TOPIC_NOACTION - var/binding = href_list["select_binding"] - var/list/phenomenon = intent_phenomena[intent] - if(phenomenon[binding]) - remove_phenomena_from_intent(intent, binding, 0) - if(selected) - set_phenomenon(selected, intent, binding) - update_phenomena_bindings() - return TOPIC_HANDLED - - if(href_list["jump"]) - var/atom/a = locate(href_list["jump"]) - var/follow = 0 - if(href_list["follow"]) - follow = 1 - if(a) - if(following) - stop_follow() - eyeobj.setLoc(get_turf(a)) - if(follow) - follow_follower(a) - to_chat(src, SPAN_NOTICE("[follow ? "Following" : "Jumping to"] \the [a]")) - return TOPIC_HANDLED - if(href_list["buy"]) - var/datum/deity_item/di = locate(href_list["buy"]) - if(di.can_buy(src)) - di.buy(src) - else - to_chat(di,SPAN_WARNING("You don't meet all the requirements for [di.name]!")) - return TOPIC_HANDLED - if(href_list["switchCategory"]) - set_nano_category(text2num(href_list["switchCategory"])) - return 1 - if(href_list["switchMenu"]) - nano_data[href_list["menu"]] = text2num(href_list["switchMenu"]) - return TOPIC_HANDLED - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_tracking.dm b/mods/gamemodes/deity/mobs/deity_tracking.dm deleted file mode 100644 index 27e9d3b552d7..000000000000 --- a/mods/gamemodes/deity/mobs/deity_tracking.dm +++ /dev/null @@ -1,40 +0,0 @@ -/mob/living/deity/verb/jump_to_follower() - set category = "Godhood" - - if(!minions) - return - - var/list/could_follow = list() - for(var/m in minions) - var/datum/mind/M = m - if(M.current && M.current.stat != DEAD) - could_follow += M.current - - if(!could_follow.len) - return - - var/choice = input(src, "Jump to follower", "Teleport") as null|anything in could_follow - if(choice) - follow_follower(choice) - -/mob/living/deity/proc/follow_follower(var/mob/living/L) - if(!L || L.stat == DEAD || !is_follower(L, silent=1)) - return - if(following) - stop_follow() - eyeobj.setLoc(get_turf(L)) - to_chat(src, SPAN_NOTICE("You begin to follow \the [L].")) - following = L - events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/mob/living/deity, keep_following)) - events_repository.register(/decl/observ/destroyed, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) - events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/mob/living/deity, stop_follow)) - -/mob/living/deity/proc/stop_follow() - events_repository.unregister(/decl/observ/moved, following, src) - events_repository.unregister(/decl/observ/destroyed, following, src) - events_repository.unregister(/decl/observ/death, following,src) - to_chat(src, SPAN_NOTICE("You stop following \the [following].")) - following = null - -/mob/living/deity/proc/keep_following(var/atom/movable/moving_instance, var/atom/old_loc, var/atom/new_loc) - eyeobj.setLoc(new_loc) diff --git a/mods/gamemodes/deity/mobs/freelook/cultnet.dm b/mods/gamemodes/deity/mobs/freelook/cultnet.dm deleted file mode 100644 index 86c718fa0f53..000000000000 --- a/mods/gamemodes/deity/mobs/freelook/cultnet.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/visualnet/cultnet - valid_source_types = list(/mob/living/, /obj/structure/deity) - chunk_type = /datum/chunk/cultnet - -/datum/chunk/cultnet/acquire_visible_turfs(var/list/visible) - for(var/source in sources) - if(isliving(source)) - var/mob/living/L = source - if(L.stat == DEAD) - continue - - for(var/turf/t in seen_turfs_in_range(source, world.view)) - visible[t] = t \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/freelook/mask.dm b/mods/gamemodes/deity/mobs/freelook/mask.dm deleted file mode 100644 index 6310effcb1ca..000000000000 --- a/mods/gamemodes/deity/mobs/freelook/mask.dm +++ /dev/null @@ -1,11 +0,0 @@ -/mob/observer/eye/freelook/cult - name = "Mask of God" - desc = "A terrible fracture of reality coinciding into a mirror to another world." - living_eye = FALSE - -/mob/observer/eye/freelook/cult/EyeMove() - if(isdeity(owner)) - var/mob/living/deity/D = owner - if(D.following) - D.stop_follow() - return ..() diff --git a/mods/gamemodes/deity/mobs/items/blood_crafting.dm b/mods/gamemodes/deity/mobs/items/blood_crafting.dm deleted file mode 100644 index 3db0c0e161d2..000000000000 --- a/mods/gamemodes/deity/mobs/items/blood_crafting.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/deity_item/blood_crafting - abstract_type = /datum/deity_item/blood_crafting - name = DEITY_BLOOD_CRAFT - desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." - category = DEITY_BLOOD_CRAFT - max_level = 1 - base_cost = 75 - var/forge_type = /obj/structure/deity/blood_forge - var/list/recipes = list() - -/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= forge_type //put structure here - var/list/L = user.feats[name] - if(!L) - L = list() - for(var/type in recipes) - L[type] = recipes[type] - user.feats[name] = L \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm deleted file mode 100644 index 7590bbb9037e..000000000000 --- a/mods/gamemodes/deity/mobs/items/deity_item.dm +++ /dev/null @@ -1,39 +0,0 @@ -// todo: declize /datum/deity_item -/datum/deity_item - var/name - var/desc - var/base_cost = 1 - var/category - var/level = 0 - var/max_level = 0 - var/list/requirements //Name of item = level of item - -/datum/deity_item/proc/can_buy(var/mob/living/deity/D) - if(max_level && level == max_level) - return FALSE - var/cost = get_cost(D) - if(cost && D.power < cost) - return FALSE - if(requirements && requirements.len) - for(var/name in requirements) - if(!D.has_item(name,requirements[name])) - return FALSE - return TRUE - -/datum/deity_item/proc/buy(var/mob/living/deity/D) - D.adjust_power(-get_cost(D)) - level++ - -/datum/deity_item/proc/get_cost(var/mob/living/deity/D) - return base_cost - - -/datum/deity_item/proc/print_level() - return "[level][max_level ? "/[max_level]" : ""]" - -/datum/deity_item/proc/print_requirements() - if(!requirements) - return "N/A" - . = "" - for(var/l in requirements) - . += "[l] [requirements[l]]
" \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/general.dm b/mods/gamemodes/deity/mobs/items/general.dm deleted file mode 100644 index d5c217565780..000000000000 --- a/mods/gamemodes/deity/mobs/items/general.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/deity_item/general - category = "General" - -/datum/deity_item/general/potential - name = "Increase Potential" - desc = "Increase the amount of natural power you regenerate." - base_cost = 10 - -/datum/deity_item/general/potential/buy(var/mob/living/deity/D) - ..() - D.adjust_power_min(5) - -/datum/deity_item/general/potential/get_cost(var/mob/living/deity/D) - return base_cost + base_cost * level**2 - -/datum/deity_item/general/regeneration - name = "Increase Power Syphon" - desc = "Decreases the time it takes to charge your power." - base_cost = 5 - -/datum/deity_item/general/regeneration/buy(var/mob/living/deity/D) - ..() - D.power_per_regen++ - -/datum/deity_item/general/regeneration/get_cost(var/mob/living/deity/D) - return base_cost + 10 * level \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/generic.dm b/mods/gamemodes/deity/mobs/items/generic.dm deleted file mode 100644 index 665814e0788b..000000000000 --- a/mods/gamemodes/deity/mobs/items/generic.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/deity_item/boon - var/boon_path - -/datum/deity_item/boon/buy(var/mob/living/deity/D) - ..() - if(boon_path) - . = new boon_path() - D.set_boon(.) - -/datum/deity_item/phenomenon - var/phenomenon_path - max_level = 1 - -/datum/deity_item/phenomenon/buy(var/mob/living/deity/D) - ..() - if(level == 1 && phenomenon_path) - D.add_phenomenon(phenomenon_path) - D.update_phenomena() - -/datum/deity_item/boon/single_charge/buy(var/mob/living/deity/D) - . = ..() - if(istype(.,/spell)) - var/spell/S = . - S.charge_counter = S.charge_max - S.charge_type = Sp_CHARGES \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/menu/deity_nano.dm b/mods/gamemodes/deity/mobs/menu/deity_nano.dm deleted file mode 100644 index 37f488f5b61b..000000000000 --- a/mods/gamemodes/deity/mobs/menu/deity_nano.dm +++ /dev/null @@ -1,81 +0,0 @@ -/mob/living/deity - var/list/nano_data = list() - var/datum/phenomenon/selected - -/mob/living/deity/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/uistate = global.self_topic_state) - if(!nano_data["categories"]) //If we don't have the categories set yet, we should populate our data. - var/list/categories = list() - for(var/cat in items_by_category) - categories += cat - nano_data["name"] = name - nano_data["form_name"] = form.name - nano_data["categories"] = categories - nano_data["menu"] = 0 //0 followers, 1 shop, 2 phenomena - nano_data["phenomenaMenu"] = 0 //0 Phenoms 1 Bindings - set_nano_category(0) - update_followers() - update_phenomena() - update_phenomena_bindings() - else - update_category() - nano_data["power"] = power - nano_data["power_min"] = power_min - nano_data["regen"] = power_per_regen - ui = SSnano.try_update_ui(user, src, ui_key, ui, nano_data, force_open) - if(!ui) - ui = new(user, src, ui_key, "deity.tmpl", "Deity Menu", 650, 600, state = uistate) - ui.set_initial_data(nano_data) - ui.open() - ui.set_auto_update(TRUE) - -/mob/living/deity/proc/set_nano_category(var/num) - nano_data["category"] = num - update_category() - -/mob/living/deity/proc/update_category() - var/actual_cat = nano_data["categories"][nano_data["category"] + 1] - var/list/cat_items = items_by_category[actual_cat] - var/list/item_data = list() - for(var/item in cat_items) - var/datum/deity_item/di = item - item_data[++item_data.len] = list("name" = di.name, "desc" = di.desc, "requirements" = di.print_requirements(), "level" = di.print_level(), "cost" = di.get_cost(), "ref" = "\ref[di]") - nano_data["item_data"] = item_data - -/mob/living/deity/proc/update_followers() - var/list/follower_data = list() - for(var/m in minions) - var/list/minion_data = list() - var/datum/mind/mind = m - if(mind.current) - if(mind.current.stat != DEAD && mind.current.loc) - minion_data["ref"] = "\ref[mind.current]" - minion_data["name"] = "[mind.current.name]" - else - minion_data["name"] = mind.name - follower_data[++follower_data.len] = minion_data - nano_data["followers"] = follower_data - -/mob/living/deity/proc/update_phenomena() - var/list/phenomena_data = list() - for(var/p in phenomena) - var/datum/phenomenon/phenomenon = phenomena[p] - phenomena_data[++phenomena_data.len] = list("name" = p, "description" = phenomenon.desc, "cost" = phenomenon.cost, "cooldown" = phenomenon.cooldown) - nano_data["phenomena"] = phenomena_data - -/mob/living/deity/proc/update_phenomena_bindings() - var/list/phenomena_bindings = list() - for(var/intent in intent_phenomena) - var/list/intent_data = list() - for(var/binding in intent_phenomena[intent]) - var/datum/phenomenon/P = intent_phenomena[intent][binding] - var/list/data = list() - if(P) - data["phenomena_name"] = P.name - data["binding"] = binding - intent_data[++intent_data.len] = data - phenomena_bindings[++phenomena_bindings.len] = list("intent" = "\ref[intent]", "intent_data" = intent_data) - nano_data["bindings"] = phenomena_bindings - //Update the hud as well. - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/_defines.dm b/mods/gamemodes/deity/mobs/phenomena/_defines.dm deleted file mode 100644 index e0268f37fa5c..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/_defines.dm +++ /dev/null @@ -1,4 +0,0 @@ -#define PHENOMENA_NEAR_STRUCTURE 1 //Must be done near a structure -#define PHENOMENA_FOLLOWER 2 //Can be done on a follower -#define PHENOMENA_NONFOLLOWER 4 //Can be done on a nonfollower. -#define PHENOMENA_MUNDANE 8 //Can affect mundane (no mind, no client) things. \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/communication.dm b/mods/gamemodes/deity/mobs/phenomena/communication.dm deleted file mode 100644 index 2b815ce00ede..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/communication.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/phenomenon/communicate - name = "Direct Communication" - desc = "Communicate directly with a mortal being. You may communicate with non-followers, but they will find you easier to ignore." - cost = 0 - flags = PHENOMENA_FOLLOWER | PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/communicate/activate(var/mob/living/L) - var/text_to_send = sanitize(input(linked, "Subjugate a member to your will", "Message a Believer") as text) - if(text_to_send) - var/text_size = 4 - if(!linked.is_follower(L)) - text_size = 1 - to_chat(L, "[text_to_send]") //Note to self: make this go to ghosties - to_chat(linked, SPAN_NOTICE("You send the message [text_to_send] to \the [L]")) - log_and_message_admins("communicated the message \"[text_to_send]\" to [key_name(L)]", linked) - -/datum/phenomenon/point - name = "Point" - desc = "Attract your follower's attentions to something nearby." - cost = 0 - flags = PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/image/arrow - -/datum/phenomenon/point/activate(var/atom/a) - ..() - if(!arrow) - arrow = image('icons/effects/markers.dmi', icon_state = "arrow", layer = POINTER_LAYER) - var/turf/T = get_turf(a) - arrow.loc = T - var/list/view = view(7,T) - for(var/m in linked.minions) - var/datum/mind/mind = m - if(mind.current) - var/mob/M = mind.current - if((M in view) && M.client) - to_chat(M, SPAN_OCCULT("Your attention is eerily drawn to \the [a].")) - M.client.images += arrow - events_repository.register(/decl/observ/logged_out, M, src, TYPE_PROC_REF(/datum/phenomenon/point, remove_image)) - spawn(20) - if(M.client) - remove_image(M) - -/datum/phenomenon/point/proc/remove_image(var/mob/living/L) - L.client.images -= arrow - events_repository.unregister(/decl/observ/logged_out, L, src) - -/datum/phenomenon/punish - name = "Punish" - desc = "Punish your followers for insubordination, the cost to use this phenomenon is based on how deadly you choose the punishment to be." - cost = 0 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living - var/static/list/punishment_list = list("Pain (0)" = 0, "Light Wound (5)" = 5, "Brain Damage (10)" = 10, "Heavy Wounds (20)" = 20) - -/datum/phenomenon/punish/activate(var/mob/living/L) - var/pain = input(linked, "Choose their punishment.", "Punishment") as null|anything in punishment_list - if(!pain) - return - if(punishment_list[pain] && linked.power < punishment_list[pain]) - to_chat(linked, SPAN_WARNING("[pain] costs too much power for you to use on \the [L]")) - return - ..() - linked.adjust_power(-punishment_list[pain]) - switch(pain) - if("Pain (0)") - L.take_damage(15, PAIN) - to_chat(L, SPAN_WARNING("You feel intense disappointment coming at you from beyond the veil.")) - if("Light Wound (5)") - L.take_damage(5) - to_chat(L, SPAN_WARNING("You feel an ethereal whip graze your very soul!")) - if("Brain Damage (10)") - L.take_damage(5, BRAIN) - to_chat(L, SPAN_DANGER("You feel your mind breaking under a otherwordly hammer...")) - if("Heavy Wounds (20)") - L.take_damage(25) - to_chat(L, SPAN_DANGER("You feel your master turn its destructive potential against you!")) - to_chat(linked, SPAN_NOTICE("You punish \the [L].")) - log_admin("[key_name(linked)] used Punishment [pain] on \the [key_name(L)]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm deleted file mode 100644 index d7dd22f3e269..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/phenomenon/movable_object/dimensional_locker - object_type = /obj/structure/closet - name = "Dimensional Locker" - cost = 10 - desc = "Summon a trans-dimensional locker anywhere within your influence. You may transport objects and things, but not people in it." - -/datum/phenomenon/movable_object/dimensional_locker/activate(var/atom/a, var/mob/living/deity/user) - var/list/mobs_inside = list() - recursive_content_check(object_to_move, mobs_inside, client_check = 0, sight_check = 0, include_objects = 0) - - for(var/i in mobs_inside) - var/mob/M = i - M.dropInto(object_to_move.loc) - to_chat(M,SPAN_WARNING("You are suddenly flung out of \the [object_to_move]!")) - ..() - -/datum/phenomenon/portals - name = "Portals" - desc = "Summon a portal linked to the last portal you've created. The portal will be destroyed if it is not linked when someone crosses it." - cost = 30 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/list/portals = list() - -/datum/phenomenon/portals/activate(var/atom/a, var/mob/living/deity/user) - ..() - var/obj/effect/portal/P = new(get_turf(a), null, 0) - P.failchance = 0 - portals += P - events_repository.register(/decl/observ/destroyed, P,src, TYPE_PROC_REF(/datum/phenomenon/portals, remove_portal)) - if(portals.len > 2) - var/removed = portals[1] - remove_portal(removed) - qdel(removed) - if(portals.len > 1) - var/obj/effect/portal/P1 = portals[1] - var/obj/effect/portal/P2 = portals[2] - P1.target = get_turf(P2) - P2.target = get_turf(P1) - -/datum/phenomenon/portals/proc/remove_portal(var/portal) - portals -= portal - events_repository.unregister(/decl/observ/destroyed, portal,src) - var/turf/T = get_turf(portal) - for(var/obj/effect/portal/P in portals) - if(P.target == T) - P.target = null - -/datum/phenomenon/banishing_smite - name = "Banishing Smite" - desc = "Deal a terrible blow to a mortal. If they are hurt enough ,they will find themselves trapped in a rift for 30 seconds." - cost = 70 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/banishing_smite/activate(var/mob/living/L, var/mob/living/deity/user) - ..() - L.take_overall_damage(rand(5,30),0,0,0,"blunt intrument") //Actual spell does 5d10 but maaaybe too much. - playsound(get_turf(L), 'sound/effects/bamf.ogg', 100, 1) - to_chat(L, SPAN_DANGER("Something hard hits you!")) - if(L.current_health < L.get_max_health()/2) //If it reduces past 50% - var/obj/effect/rift/R = new(get_turf(L)) - L.visible_message(SPAN_DANGER("\The [L] is quickly sucked into \a [R]!")) - L.forceMove(R) - spawn(300) - qdel(R) diff --git a/mods/gamemodes/deity/mobs/phenomena/conversion.dm b/mods/gamemodes/deity/mobs/phenomena/conversion.dm deleted file mode 100644 index 1f0954c91350..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conversion.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/phenomenon/conversion - name = "Conversion" - desc = "Ask a non-follower to convert to your cult. This is completely voluntary. Requires the subject to be close to an altar." - cost = 20 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/conversion/can_activate(var/atom/target) - if(!..()) - return 0 - var/is_good = 0 - for(var/obj/structure/deity/altar/A in linked.structures) - if(get_dist(target, A) < 2) - is_good = 1 - break - if(!is_good) - to_chat(linked,SPAN_WARNING("\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].")) - return 0 - return 1 - -/datum/phenomenon/conversion/activate(var/mob/living/L) - to_chat(src,SPAN_NOTICE("You give \the [L] a chance to willingly convert. May they choose wisely.")) - var/choice = alert(L, "You feel a weak power enter your mind attempting to convert it.", "Conversion", "Allow Conversion", "Deny Conversion") - if(choice == "Allow Conversion") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(L.mind,1, "Servant of [linked]", "You willingly give your mind to it, may it bring you fortune.", specific_god=linked) - else - to_chat(L, SPAN_WARNING("With little difficulty you force the intrusion out of your mind. May it stay that way.")) - to_chat(src, SPAN_WARNING("\The [L] decides not to convert.")) - -/datum/phenomenon/forced_conversion - name = "Forced Conversion" - desc = "Force a non-follower to join you. They need to be on top of an altar and conscious for this to work. They may resist, but that will hurt them." - cost = 100 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/forced_conversion/can_activate(var/mob/living/L) - if(!..()) - return 0 - var/obj/structure/deity/altar/A = locate() in get_turf(L) - if(!A || A.linked_god != linked) - to_chat(linked,SPAN_WARNING("\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted.")) - return 0 - - return 1 - -/datum/phenomenon/forced_conversion/activate(var/mob/living/L) - var/obj/structure/deity/altar/A = locate() in get_turf(L) - A.set_target(L) - to_chat(linked, SPAN_NOTICE("You imbue \the [A] with your power, setting forth to force \the [L] to your will.")) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/generic.dm b/mods/gamemodes/deity/mobs/phenomena/generic.dm deleted file mode 100644 index 3163ea42ab54..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/generic.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/phenomenon/movable_object - var/object_type - var/atom/movable/object_to_move - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - -/datum/phenomenon/movable_object/New() - ..() - add_object() - -/datum/phenomenon/movable_object/Destroy() - events_repository.unregister(/decl/observ/destroyed, object_to_move,src) - if(!object_to_move.loc) - QDEL_NULL(object_to_move) - . = ..() - -/datum/phenomenon/movable_object/proc/add_object() - if(object_to_move) - events_repository.unregister(/decl/observ/destroyed, object_to_move,src) - object_to_move = new object_type() - events_repository.register(/decl/observ/destroyed, object_to_move, src, PROC_REF(add_object)) - -/datum/phenomenon/movable_object/activate(var/atom/a, var/mob/living/deity/user) - ..() - if(object_to_move == a) - object_to_move.forceMove(null) //Move to null space - else - var/turf/T = get_turf(a) - //No dense turf/stuff - if(T.density) - return - for(var/i in T) - var/atom/A = i - if(A.density) - return - object_to_move.forceMove(T) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm deleted file mode 100644 index 8a94ae441cbf..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/narsie.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/phenomenon/exude_blood - name = "Exhude Blood" - desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." - cost = 20 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomenon/exude_blood/can_activate(var/mob/living/human/H) - if(!..()) - return 0 - - if(!H.should_have_organ(BP_HEART) || H.vessel.total_volume == H.species.blood_volume) - to_chat(linked, SPAN_WARNING("\The [H] doesn't require anymore blood.")) - return 0 - return 1 - -/datum/phenomenon/exude_blood/activate(var/mob/living/human/H, var/mob/living/deity/user) - H.adjust_blood(30) - to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) - - -/datum/phenomenon/hellscape - name = "Reveal Hellscape" - desc = "Show a non-follower what awaits their souls after you are through with them." - cost = 60 - cooldown = 450 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - var/static/list/creepy_notes = list("Your knees give out as an unnatural screaming rings your ears.", - "You breathe in ash and decay, your lungs gasping for air as your body gives way to the floor.", - "An extreme pressure comes over you, as if an unknown force has marked you.") - -/datum/phenomenon/hellscape/activate(var/mob/living/L) - to_chat(L, "[pick(creepy_notes)]") - L.damageoverlaytemp = 100 - sound_to(L, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(L, STAT_WEAK, 2) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm deleted file mode 100644 index 8d28ab5fc6e6..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/phenomenon - var/name = "Phenomena" - var/desc = "This has no desc." - var/cost = 0 - var/mob/living/deity/linked - var/flags = 0 - var/cooldown = 10 - var/refresh_time = 0 - var/expected_type - -/datum/phenomenon/New(var/master) - linked = master - ..() - -/datum/phenomenon/Destroy() - linked.remove_phenomenon(src) - return ..() - -/datum/phenomenon/proc/Click(var/atom/target) - if(can_activate(target)) - linked.adjust_power(-cost) - refresh_time = world.time + cooldown - activate(target) - -/datum/phenomenon/proc/can_activate(var/atom/target) - if(!linked) - return 0 - if(refresh_time > world.time) - to_chat(linked, SPAN_WARNING("\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!")) - return 0 - - if(!linked.form) - to_chat(linked, SPAN_WARNING("You must choose your form first!")) - return 0 - - if(expected_type && !istype(target,expected_type)) - return 0 - - if(flags & PHENOMENA_NEAR_STRUCTURE) - if(!linked.near_structure(target, 1)) - to_chat(linked, SPAN_WARNING("\The [target] needs to be near a holy structure for your powers to work!")) - return 0 - - if(isliving(target)) - var/mob/living/L = target - if(!L.mind || !L.client) - if(!(flags & PHENOMENA_MUNDANE)) - to_chat(linked, SPAN_WARNING("\The [L]'s mind is too mundane for you to influence.")) - return 0 - else - if(linked.is_follower(target, silent = 1)) - if(!(flags & PHENOMENA_FOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on the flock!")) - return 0 - else if(!(flags & PHENOMENA_NONFOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on non-believers.")) - return 0 - - if(cost > linked.power) - to_chat(linked, SPAN_WARNING("You need more power to use [name] (Need [cost] power, have [linked.power])!")) - return 0 - - return 1 - -/datum/phenomenon/proc/activate(var/target) - to_chat(linked, SPAN_NOTICE("You use the phenomenon [name] on \the [target]")) - log_and_message_admins("uses the phenomenon [name] on \the [target]", linked, get_turf(target)) - return - -/datum/phenomenon/proc/get_desc() - . = desc - if(cooldown) - . = "Cooldown: [cooldown/10] seconds. [.]" - if(cost) - . = "Cost: [cost] power. [.]" \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm deleted file mode 100644 index 1351a50a8920..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/starlight.dm +++ /dev/null @@ -1,232 +0,0 @@ -/datum/phenomenon/herald - name = "Bestow Heraldry" - desc = "Turn one of your followers into a herald of your coming." - cost = 100 - cooldown = 60 SECONDS - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - var/static/list/possible_forms = list( - "Champion" = list("description" = "A protector of the faith. Fully protected by knightly armor, a Champion can shoot fire from their hands.", - "armor" = /obj/item/clothing/suit/armor/sunsuit, - "helm" = /obj/item/clothing/head/helmet/sunhelm, - "extension" = /datum/extension/deity_be_near/champion, - "spells" = list(/spell/hand/duration/sunwrath) - ), - "Oracle" = list("description" = "A preacher of the faith, the Oracle gives off heavenly light that they can use to heal followers and stun enemies.", - "armor" = /obj/item/clothing/suit/armor/sunrobe, - "extension" = /datum/extension/deity_be_near/oracle, - "spells" = list(/spell/targeted/glimpse_of_eternity) - ), - "Traitor" = list("description" = "Believers that reject the sun god's blessings, instead reveling in the shadows. Can turn invisible when its dark, and can move unprotected in space.", - "armor" = /obj/item/clothing/suit/space/shadowsuit, - "helm" = /obj/item/clothing/head/helmet/space/shadowhood, - "extension" = /datum/extension/deity_be_near/traitor, - "spells" = list(/spell/veil_of_shadows) - ) - ) - -/datum/phenomenon/herald/can_activate(var/a) - if(!..()) - return FALSE - return valid_for_herald(a) - -/datum/phenomenon/herald/proc/valid_for_herald(var/a) - var/mob/living/human/H = a - if(!istype(H)) - return FALSE - var/obj/item/I = H.get_equipped_item(slot_wear_suit_str) - if(I) - var/datum/extension/deity_be_near/dbn = get_extension(I, /datum/extension/deity_be_near) - if(dbn) - return FALSE - return TRUE - -/datum/phenomenon/herald/proc/equip_slot(var/mob/living/L, var/slot_id, var/new_item) - var/equipped = L.get_equipped_slot_for_item(slot_id) - if(equipped) - L.try_unequip(equipped, get_turf(L)) - L.equip_to_slot_if_possible(new_item, slot_id) - -/datum/phenomenon/herald/Topic(var/href, var/list/href_list) - if(..()) - return 1 - if(usr != linked) - return 1 - - if(href_list["herald"]) - var/list/form = possible_forms[href_list["herald"]] - var/mob/living/L = locate(href_list["target"]) - var/turf/T = get_turf(L) - if(!L || !valid_for_herald(L) || !form) - return 1 - var/type = form["armor"] - var/obj/item/I = new type(T) - var/datum/extension/deity_be_near/extension = set_extension(I, form["extension"], linked) - L.equip_to_slot_or_store_or_drop(I, slot_wear_suit_str) - if(form["helm"]) - var/h_type = form["helm"] - var/obj/item/helm = new h_type(T) - L.equip_to_slot_or_store_or_drop(helm, slot_head_str) - extension.expected_helmet = helm.type //We only do by type because A. its easier to manage and B the chances of it being non-unique in a normal game is very small - if(form["weapon"]) - var/w_type = form["weapon"] - L.put_in_hands_or_store_or_drop(new w_type(T)) - if(form["spells"]) - for(var/s in form["spells"]) - var/spell/boon = new s - boon.set_connected_god(linked) - L.add_spell(boon) - to_chat(L, "You have been chosen by your master to lead your fellow followers into the next age of rebirth.
You have been granted powerful armor and a powerful spell. Don't lose them, as they are your key to your divinity and leadership.
You also have particular sway over your deity's structures.
") - to_chat(linked, SPAN_NOTICE("\The [L] is now your herald!")) - linked.remove_phenomenon(name) - show_browser(linked, null, "window=herald") - -/datum/phenomenon/herald/activate(var/mob/living/human/H) - var/list/html = list() - html += "

Heralds

" - html += "
Pick the type of herald you want.
" - html += "" - for(var/type in possible_forms) - var/list/form = possible_forms[type] - html += "" - html += "
NameDescription
[type][form["description"]]
" - show_browser(linked, jointext(html,null), "window=herald") - -/datum/phenomenon/create_gateway - name = "Create Gateway" - desc = "Creates a gateway from this world to the next. Gateways syphon absurd amounts of power but can be sacrificed to summon powerful minions." - cost = 200 - flags = PHENOMENA_NEAR_STRUCTURE - expected_type = /atom - -/datum/phenomenon/create_gateway/can_activate(var/atom/a) - if(!..()) - return 0 - if(istype(a, /obj/structure/deity/gateway)) - var/obj/structure/deity/gateway/G = a - if(G.linked_god == linked) - return 1 - var/turf/T = get_turf(a) - if(!T || T.density) - return 0 - for(var/i in T) - var/atom/at = i - if(at.density) - return 0 - return 1 - -/datum/phenomenon/create_gateway/activate(var/atom/a) - ..() - if(istype(a, /obj/structure/deity/gateway)) - qdel(a) - else - new /obj/structure/deity/gateway(get_turf(a), linked) - -/datum/phenomenon/flickering_whisper - name = "Flickering Whisper" - desc = "Whisper to a non-believer, allowing you to intrude on their thoughts and see what they see." - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/flickering_whisper/activate(var/mob/living/L) - var/atom/whisper_from - for(var/obj/structure/deity/radiant_statue/rs in view(3, L)) - whisper_from = rs - break - var/message = sanitize(input(linked, "What is your message?", null) as null|text) - if(!linked || !message || QDELETED(src)) - return - to_chat(L, SPAN_OCCULT("[whisper_from ? "The [whisper_from] speaks to you" : "You hear a whisper say"] \"[message]\"")) - - linked.eyenet.add_source(L) - events_repository.register(/decl/observ/destroyed, L, src, PROC_REF(deactivate_look)) - addtimer(CALLBACK(src, PROC_REF(deactivate_look), L), 30 SECONDS) - -/datum/phenomenon/flickering_whisper/proc/deactivate_look(var/mob/viewer) - if(!linked.is_follower(viewer)) //Don't remove if they are follower - linked.eyenet.remove_source(viewer) - events_repository.unregister(/decl/observ/destroyed, viewer, src) - -/datum/phenomenon/burning_glare - name = "Burning Glare" - desc = "Burn a victim. If they are burnt enough, you'll set them ablaze." - cost = 100 - flags = PHENOMENA_NONFOLLOWER|PHENOMENA_NEAR_STRUCTURE - cooldown = 30 SECONDS - expected_type = /mob/living - -/datum/phenomenon/burning_glare/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_DANGER("You feel yourself burn!")) - L.take_damage(10, BURN) - if(L.get_damage(BURN) > 60) - L.fire_stacks += 50 - L.IgniteMob() - -/datum/phenomenon/divine_right - name = "Divine Right" - desc = "Trigger your rebirth into the body of someone wearing a herald's uniform. This takes time, requires 3 open gateways, and if the body is destroyed during the ritual... so are you. But once complete, you become an unstoppable demigod of unnatural power." - cost = 300 - cooldown = 180 SECONDS - flags = PHENOMENA_FOLLOWER|PHENOMENA_NEAR_STRUCTURE - expected_type = /mob/living - -/datum/phenomenon/divine_right/can_activate(var/mob/living/L) - if(!..()) - return FALSE - var/active_gateways = 0 - for(var/obj/structure/deity/gateway/G in linked.structures) - active_gateways += 1 - - if(active_gateways < 3) - to_chat(linked, SPAN_WARNING("You do not have enough gateways activated.")) - return FALSE - - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O, /datum/extension/deity_be_near)) - var/datum/extension/deity_be_near/dbn = get_extension(O, /datum/extension/deity_be_near) - if(dbn.wearing_full()) - return TRUE - to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) - return FALSE - -/datum/phenomenon/divine_right/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) - to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) - L.ghostize() - SET_STATUS_MAX(L, STAT_WEAK, 1) - new /obj/aura/starborn(L) - L.status_flags |= GODMODE - events_repository.register(/decl/observ/destroyed, L,src,PROC_REF(fail_ritual)) - addtimer(CALLBACK(src, PROC_REF(succeed_ritual), L), 600 SECONDS) //6 minutes - for(var/mob/living/player in global.player_list) - sound_to(player, 'sound/effects/cascade.ogg') - if(player?.mind?.assigned_job?.is_holy) - to_chat(player, SPAN_OCCULT("Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.")) - else if(player != linked && !linked.is_follower(player, silent = 1)) - to_chat(player, SPAN_WARNING("The world swims around you for just a moment... something is wrong. Very wrong.")) - else - to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) - -/datum/phenomenon/divine_right/proc/fail_ritual(var/mob/living/L) - qdel(linked) - -/datum/phenomenon/divine_right/proc/succeed_ritual(var/mob/living/L) - to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) - for(var/mob/living/player in global.player_list) - sound_to(player, 'sound/effects/cascade.ogg') - to_chat(player, SPAN_OCCULT("\The [linked] has been born into flesh. Kneel to its authority or else.")) - linked.mind.transfer_to(L) - L.SetName("[linked] Incarnate") - L.real_name = "[linked] Incarnate" - -/datum/phenomenon/movable_object/wisp - name = "Wisp" - desc = "Creates or moves a small ball of light for your followers to use." - cost = 30 - object_type = /obj/item/flashlight/slime - -/datum/phenomenon/movable_object/wisp/add_object() - ..() - object_to_move.SetName("wisp") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm deleted file mode 100644 index 381e885d3187..000000000000 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/phenomenon/warp - name = "Warp Body" - desc = "Corrupt a mortal being, causing their DNA to break and their body to fail on them." - cost = 90 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomenon/warp/activate(var/mob/living/L) - ..() - L.take_damage(20, CLONE) - SET_STATUS_MAX(L, STAT_WEAK, 2) - to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) - -/datum/phenomenon/rock_form - name = "Rock Form" - desc = "Convert your mortal followers into immortal stone beings." - cost = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomenon/rock_form/activate(var/mob/living/human/H) - ..() - to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) - H.change_species(SPECIES_GOLEM) - SET_STATUS_MAX(H, STAT_WEAK, 5) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/say.dm b/mods/gamemodes/deity/mobs/say.dm deleted file mode 100644 index 1dab1a38aa3b..000000000000 --- a/mods/gamemodes/deity/mobs/say.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity/say(var/message, var/decl/language/speaking = null, var/verb="says") - if(!..()) - return 0 - if(pylon) - pylon.audible_message("\The [pylon] reverberates, \"[message]\"") - else - for(var/m in minions) - var/datum/mind/mind = m - to_chat(mind.current, "[message]") \ No newline at end of file diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm deleted file mode 100644 index c052abdf9a24..000000000000 --- a/mods/gamemodes/deity/overrides.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/item/sword/cultblade/can_use_safely(mob/living/user) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - return ..() || (user.mind in godcult.current_antagonists) - -/datum/reagents/Topic(href, href_list) - . = ..() - if(!. && href_list["deconvert"]) - var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) - if(LAZYACCESS(data, "holy")) - var/mob/living/target = locate(href_list["deconvert"]) - if(istype(target) && !QDELETED(target) && target.mind) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(target.mind, TRUE) - -/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) - . = ..() - if(.) - return . - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - if(M.mind && godcult.is_antagonist(M.mind)) - if(REAGENT_VOLUME(holder, type) > 5) - M.take_damage(5, PAIN, do_update_health = FALSE) - M.take_damage(1, BRUTE) - if(prob(10)) //Only annoy them a /bit/ - to_chat(M, SPAN_DANGER("You feel your insides curdle and burn! \[Give Into Purity\]")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm deleted file mode 100644 index 9f5b18b6aaa8..000000000000 --- a/mods/gamemodes/deity/screen/intent.dm +++ /dev/null @@ -1,45 +0,0 @@ -/obj/screen/intent/deity - var/list/desc_screens = list() - screen_loc = "RIGHT-5:122,BOTTOM:8" - -/obj/screen/intent/deity/on_update_icon() - . = ..() - cut_overlays() - add_overlay(image('icons/mob/screen/phenomena.dmi', icon_state = "hud", pixel_x = -138, pixel_y = -1)) - compile_overlays() - -/obj/screen/intent/deity/proc/sync_to_mob(var/mob) - var/mob/living/deity/deity = mob - for(var/i in 1 to deity.control_types.len) - var/obj/screen/deity_marker/S = new(null, deity) - desc_screens[deity.control_types[i]] = S - S.screen_loc = screen_loc - //This sets it up right. Trust me. - S.maptext_y = 33/2*i - i*i/2 - 10 - deity.client.screen += S - update_text() - -/obj/screen/intent/deity/proc/update_text() - var/mob/living/deity/deity = usr - var/mob/owner = owner_ref?.resolve() - if(!istype(deity) || !istype(owner) || owner != deity) - return - var/decl/intent/intent = owner.get_intent() - for(var/i in deity.control_types) - var/obj/screen/deity_marker/S = desc_screens[i] - var/datum/phenomenon/P = deity.intent_phenomena[intent][i] - if(P) - S.maptext = "[P.name]" - else - S.maptext = null - -/obj/screen/intent/deity/handle_click(mob/user, params) - ..() - update_text() - -/obj/screen/deity_marker - name = "" //Don't want them to be able to actually right click it. - mouse_opacity = MOUSE_OPACITY_UNCLICKABLE - icon_state = "blank" - maptext_width = 128 - maptext_x = -125 \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/boon.dm b/mods/gamemodes/deity/spells/boon.dm deleted file mode 100644 index 269a0b4bc4cf..000000000000 --- a/mods/gamemodes/deity/spells/boon.dm +++ /dev/null @@ -1,11 +0,0 @@ -/spell - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? - -/spell/proc/set_connected_god(var/mob/living/deity/god) - connected_god = god - -// todo: godform check_charge to parallel take_charge. currently a boon always succeeds -/spell/take_charge(mob/user, skipcharge) - if(connected_god) - return connected_god.take_charge(user, max(1, charge_max/10)) - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/construction.dm b/mods/gamemodes/deity/spells/construction.dm deleted file mode 100644 index 0005154ad6ea..000000000000 --- a/mods/gamemodes/deity/spells/construction.dm +++ /dev/null @@ -1,55 +0,0 @@ -#define CONSTRUCT_SPELL_COST 1 -#define CONSTRUCT_SPELL_TYPE 2 - -/spell/construction - name = "Basic Construction" - desc = "This ability will let you summon a structure of your choosing." - - cast_delay = 10 - charge_max = 100 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/construction/choose_targets() - var/list/possible_targets = list() - if(connected_god && connected_god.form) - for(var/type in connected_god.form.buildables) - var/cost = 10 - if(ispath(type, /obj/structure/deity)) - var/obj/structure/deity/D = type - cost = initial(D.build_cost) - possible_targets["[connected_god.get_type_name(type)] - [cost]"] = list(cost, type) - var/choice = input("Construct to build.", "Construction") as null|anything in possible_targets - if(!choice) - return - if(locate(/obj/structure/deity) in get_turf(holder)) - return - - return possible_targets[choice] - else - return - -/spell/construction/cast_check(var/skipcharge, var/mob/user, var/list/targets) - if(!..()) - return 0 - var/turf/T = get_turf(user) - if(skipcharge && !valid_deity_structure_spot(targets[CONSTRUCT_SPELL_TYPE], T, connected_god, user)) - return 0 - else - for(var/obj/O in T) - if(O.density) - to_chat(user, SPAN_WARNING("Something here is blocking your construction!")) - return 0 - return 1 - -/spell/construction/cast(var/target, mob/user) - charge_max = target[CONSTRUCT_SPELL_COST] - target = target[CONSTRUCT_SPELL_TYPE] - var/turf/T = get_turf(user) - new target(T, connected_god) -#undef CONSTRUCT_SPELL_COST -#undef CONSTRUCT_SPELL_TYPE \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/open_gateway.dm b/mods/gamemodes/deity/spells/open_gateway.dm deleted file mode 100644 index db83a05c8917..000000000000 --- a/mods/gamemodes/deity/spells/open_gateway.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/open_gateway - name = "Open Gateway" - desc = "Open a gateway for your master. Don't do it for too long, or you will die." - - charge_max = 600 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/open_gateway/choose_targets() - var/mob/living/spellcaster = holder - var/turf/source_turf = get_turf(spellcaster) - holder.visible_message(SPAN_NOTICE("A gateway opens up underneath \the [spellcaster]!")) - var/deity - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(spellcaster.mind && (spellcaster.mind in godcult.current_antagonists)) - deity = godcult.get_deity(spellcaster.mind) - return list(new /obj/structure/deity/gateway(source_turf, deity)) - -/spell/open_gateway/cast(var/list/targets, var/mob/holder, var/channel_count) - if(prob((channel_count / 5) * 100)) - to_chat(holder, SPAN_DANGER("If you hold the portal open for much longer you'll be ripped apart!")) - if(channel_count == 6) - to_chat(holder, SPAN_DANGER("The gateway consumes you... leaving nothing but dust.")) - holder.dust() - - -/spell/open_gateway/after_spell(var/list/targets) - QDEL_NULL_LIST(targets) \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/vision.dm b/mods/gamemodes/deity/spells/vision.dm deleted file mode 100644 index dabe6cf4fcaf..000000000000 --- a/mods/gamemodes/deity/spells/vision.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/camera_connection/god_vision - name = "All Seeing Eye" - desc = "See what your master sees." - - charge_max = 10 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - extension_type = /datum/extension/eye/freelook - - hud_state = "gen_mind" - -/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) - ..() - - var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) - if(!fl) - return - fl.set_visualnet(god.eyenet) - diff --git a/mods/gamemodes/deity/structures/altar.dm b/mods/gamemodes/deity/structures/altar.dm deleted file mode 100644 index 888e4c935a9d..000000000000 --- a/mods/gamemodes/deity/structures/altar.dm +++ /dev/null @@ -1,106 +0,0 @@ -/obj/structure/deity/altar - name = "altar" - desc = "A structure made for the express purpose of religion." - current_health = 50 - power_adjustment = 5 - deity_flags = DEITY_STRUCTURE_ALONE - build_cost = 1000 - var/mob/living/target - var/cycles_before_converted = 5 - var/next_cycle = 0 - -/obj/structure/deity/altar/Destroy() - if(target) - remove_target() - if(linked_god) - to_chat(src, SPAN_DANGER("You've lost an altar!")) - return ..() - -/obj/structure/deity/altar/grab_attack(obj/item/grab/grab, mob/user) - var/mob/living/victim = grab.get_affecting_mob() - if(grab.force_danger() && istype(victim)) - victim.dropInto(loc) - SET_STATUS_MAX(victim, STAT_WEAK, 1) - user.visible_message(SPAN_WARNING("\The [user] throws \the [victim] onto \the [src]!")) - qdel(grab) - return TRUE - return ..() - -/obj/structure/deity/altar/Process() - if(!target || world.time < next_cycle) - return - if(!linked_god || target.stat) - to_chat(linked_god, SPAN_WARNING("\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!")) - remove_target() - return - - next_cycle = world.time + 10 SECONDS - cycles_before_converted-- - if(!cycles_before_converted) - src.visible_message("For one thundering moment, \the [target] cries out in pain before going limp and broken.") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(target.mind,1, "Servant of [linked_god]","Your loyalty may be faulty, but you know that it now has control over you...", specific_god=linked_god) - remove_target() - return - - switch(cycles_before_converted) - if(4) - text = "You can't think straight..." - if(3) - text = "You feel like your thought are being overriden..." - if(2) - text = "You can't... concentrate... must... resist!" - if(1) - text = "Can't... resist... anymore." - to_chat(linked_god, SPAN_WARNING("\The [target] is getting close to conversion!")) - to_chat(target, "[text]. Resist Conversion") - - -//Used for force conversion. -/obj/structure/deity/altar/proc/set_target(var/mob/living/L) - if(target || !linked_god) - return - cycles_before_converted = initial(cycles_before_converted) - START_PROCESSING(SSobj, src) - target = L - update_icon() - events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - events_repository.register(/decl/observ/moved, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - events_repository.register(/decl/observ/death, L, src, TYPE_PROC_REF(/obj/structure/deity/altar, remove_target)) - -/obj/structure/deity/altar/proc/remove_target() - STOP_PROCESSING(SSobj, src) - events_repository.unregister(/decl/observ/destroyed, target, src) - events_repository.unregister(/decl/observ/moved, target, src) - events_repository.unregister(/decl/observ/death, target, src) - target = null - update_icon() - -/obj/structure/deity/altar/OnTopic(var/user, var/list/href_list) - if(href_list["resist"]) - var/mob/living/M = locate(href_list["resist"]) - if(!istype(M) || target != M || M.stat || M.is_on_special_ability_cooldown()) - return TOPIC_HANDLED - - M.set_special_ability_cooldown(10 SECONDS) - M.visible_message(SPAN_WARNING("\The [M] writhes on top of \the [src]!"), SPAN_NOTICE("You struggle against the intruding thoughts, keeping them at bay!")) - to_chat(linked_god, SPAN_WARNING("\The [M] slows its conversion through willpower!")) - cycles_before_converted++ - if(prob(50)) - to_chat(M, SPAN_DANGER("The mental strain is too much for you! You feel your body weakening!")) - M.take_damage(15, TOX, do_update_health = FALSE) - M.take_damage(30, PAIN) - return TOPIC_REFRESH - -/obj/structure/deity/altar/on_update_icon() - ..() - if(target) - add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) - -/obj/structure/deity/altar/nullrod_act(mob/user, obj/item/nullrod/rod) - if(!linked_god.silenced) //Don't want them to infinity spam it. - linked_god.silence(10) - new /obj/effect/temporary(get_turf(src),'icons/effects/effects.dmi',"purple_electricity_constant", 10) - visible_message(SPAN_NOTICE("\The [src] groans in protest as reality settles around \the [rod].")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/blood_forge.dm b/mods/gamemodes/deity/structures/blood_forge.dm deleted file mode 100644 index 3b23da40630e..000000000000 --- a/mods/gamemodes/deity/structures/blood_forge.dm +++ /dev/null @@ -1,66 +0,0 @@ -/obj/structure/deity/blood_forge - name = "unholy forge" - desc = "This forge gives off no heat, no light, its flames look almost unnatural." - icon_state = "forge" - build_cost = 1000 - current_health = 50 - var/busy = 0 - var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list( - "Cost" = "Blood", - "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames" - ) - - power_adjustment = 2 - -/obj/structure/deity/blood_forge/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/list/recipes = linked_god.feats[recipe_feat_list] - if(!recipes) - return TRUE - var/dat = "
Recipes


Item - [text_modifications["Cost"]] Cost
" - for(var/type in recipes) - var/atom/a = type - var/cost = recipes[type] - dat += "[initial(a.name)] - [cost]
[initial(a.desc)]

" - show_browser(user, dat, "window=forge") - return TRUE - -/obj/structure/deity/blood_forge/CanUseTopic(var/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return STATUS_CLOSE - return ..() - -/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) - if(href_list["make_recipe"]) - var/list/recipes = linked_god.feats[recipe_feat_list] - var/type = locate(href_list["make_recipe"]) in recipes - if(type) - var/cost = recipes[type] - craft_item(type, cost, user) - return TOPIC_REFRESH - -/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) - if(busy) - to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) - return - - busy = 1 - to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) - for(var/count = 0, count < blood_cost/10, count++) - if(!do_after(user, 50,src)) - busy = 0 - return - user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) - if(linked_god) - linked_god.take_charge(user, 10) - var/obj/item/I = new path(get_turf(src)) - user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") - busy = 0 - -/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) - if(linked_god) - linked_god.take_charge(user, charge) \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/pylon.dm b/mods/gamemodes/deity/structures/pylon.dm deleted file mode 100644 index 4b977e2726d6..000000000000 --- a/mods/gamemodes/deity/structures/pylon.dm +++ /dev/null @@ -1,75 +0,0 @@ - -/obj/structure/deity/pylon - name = "pylon" - desc = "A crystal platform used to communicate with the deity." - build_cost = 400 - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - var/list/intuned = list() - -/obj/structure/deity/pylon/attack_deity(var/mob/living/deity/D) - if(D.pylon == src) - D.leave_pylon() - else - D.possess_pylon(src) - -/obj/structure/deity/pylon/Destroy() - if(linked_god && linked_god.pylon == src) - linked_god.leave_pylon() - return ..() - -/obj/structure/deity/pylon/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - if(!linked_god) - return FALSE - if(L in intuned) - remove_intuned(L) - else - add_intuned(L) - return TRUE - -/obj/structure/deity/pylon/proc/add_intuned(var/mob/living/L) - if(L in intuned) - return - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling yourself intune to its vibrations.")) - intuned += L - events_repository.register(/decl/observ/destroyed, L,src, TYPE_PROC_REF(/obj/structure/deity/pylon, remove_intuned)) - -/obj/structure/deity/pylon/proc/remove_intuned(var/mob/living/L) - if(!(L in intuned)) - return - to_chat(L, SPAN_WARNING("You no longer feel intuned to \the [src].")) - intuned -= L - events_repository.unregister(/decl/observ/destroyed, L, src) - -/obj/structure/deity/pylon/OnTopic(var/mob/living/human/user, var/href_list) - if(href_list["vision_jump"]) - if(istype(user)) - to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) - if(prob(5)) - user.vomit() - else - to_chat(user, SPAN_NOTICE("You jump to \the [src]")) - if(user.eyeobj) - user.eyeobj.setLoc(locate(href_list["vision_jump"])) - else - CRASH("[user] does not have an eyeobj") - . = TOPIC_REFRESH - . = ..() - -/obj/structure/deity/pylon/hear_talk(mob/M, text, verb, decl/language/speaking) - if(!linked_god) - return - if(linked_god.pylon != src) - if(!(M in intuned)) - return - for(var/obj/structure/deity/pylon/P in linked_god.structures) - if(P == src || linked_god.pylon == P) - continue - P.audible_message("\The [P] resonates, \"[text]\"") - to_chat(linked_god, "[html_icon(src)] [M] (P) [verb], [linked_god.pylon == src ? "" : ""]\"[text]\"[linked_god.pylon == src ? "" : ""]") - if(linked_god.minions.len) - for(var/minion in linked_god.minions) - var/datum/mind/mind = minion - if(mind.current && mind.current.eyeobj) //If it is currently having a vision of some sort - to_chat(mind.current,"[html_icon(src)] [M] (J) [verb], \"[text]\"") diff --git a/mods/gamemodes/deity/structures/structures.dm b/mods/gamemodes/deity/structures/structures.dm deleted file mode 100644 index c3d9ea65b30b..000000000000 --- a/mods/gamemodes/deity/structures/structures.dm +++ /dev/null @@ -1,68 +0,0 @@ -/proc/valid_deity_structure_spot(var/type, var/turf/target, var/mob/living/deity/deity, var/mob/living/user) - var/obj/structure/deity/D = type - var/flags = initial(D.deity_flags) - - if(flags & DEITY_STRUCTURE_NEAR_IMPORTANT && !deity.near_structure(target)) - if(user) - to_chat(user, SPAN_WARNING("You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!")) - return 0 - - if(flags & DEITY_STRUCTURE_ALONE) - for(var/structure in deity.structures) - if(istype(structure,type) && get_dist(target,structure) <= 3) - if(user) - to_chat(user, SPAN_WARNING("You are too close to another [deity.get_type_name(type)]!")) - return 0 - return 1 - -/obj/structure/deity - icon = 'icons/obj/cult.dmi' - max_health = 10 - density = TRUE - anchored = TRUE - icon_state = "tomealtar" - is_spawnable_type = FALSE // will usually runtime without a linked god - - var/mob/living/deity/linked_god - var/power_adjustment = 1 //How much power we get/lose - var/build_cost = 0 //How much it costs to build this item. - var/deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT - -/obj/structure/deity/Initialize(mapload, var/god) - . = ..(mapload) - if(god) - linked_god = god - linked_god.form.sync_structure(src) - linked_god.adjust_source(power_adjustment, src) - -/obj/structure/deity/Destroy() - if(linked_god) - linked_god.adjust_source(-power_adjustment, src) - linked_god = null - return ..() - -/obj/structure/deity/attackby(obj/item/W, mob/user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(src) - playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 50, 1) - user.visible_message( - SPAN_DANGER("[user] hits \the [src] with \the [W]!"), - SPAN_DANGER("You hit \the [src] with \the [W]!"), - SPAN_DANGER("You hear something breaking!") - ) - take_damage(W.get_attack_force(user), W.atom_damage_type) - -/obj/structure/deity/physically_destroyed(mob/user) - SHOULD_CALL_PARENT(FALSE) - qdel(src) - . = TRUE - -/obj/structure/deity/physically_destroyed(var/skip_qdel) - visible_message(SPAN_DANGER("\The [src] crumbles!")) - . = ..() - -/obj/structure/deity/bullet_act(var/obj/item/projectile/P) - take_damage(P.damage, P.atom_damage_type) - -/obj/structure/deity/proc/attack_deity(var/mob/living/deity/deity) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/trap.dm b/mods/gamemodes/deity/structures/trap.dm deleted file mode 100644 index 240050d33b9c..000000000000 --- a/mods/gamemodes/deity/structures/trap.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/deity/trap - density = FALSE - current_health = 1 - var/triggered = 0 - -/obj/structure/deity/trap/Initialize() - . = ..() - events_repository.register(/decl/observ/entered, get_turf(src),src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) - -/obj/structure/deity/trap/Destroy() - events_repository.unregister(/decl/observ/entered, get_turf(src),src) - return ..() - -/obj/structure/deity/trap/Move() - events_repository.unregister(/decl/observ/entered, get_turf(src),src) - . = ..() - events_repository.register(/decl/observ/entered, get_turf(src), src, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) - -/obj/structure/deity/trap/attackby(obj/item/W, mob/user) - trigger(user) - return ..() - -/obj/structure/deity/trap/bullet_act() - return - -/obj/structure/deity/trap/proc/trigger(var/atom/entered, var/atom/movable/enterer) - if(triggered > world.time || !isliving(enterer)) - return - - triggered = world.time + 30 SECONDS \ No newline at end of file diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index 737f150b57eb..71eeb7977d42 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -160,7 +160,7 @@ /area/map_template/syndicate_mothership/raider_base) "aK" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/painting/monkey_painting{ pixel_x = -28; pixel_y = 4 @@ -317,7 +317,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bg" = ( @@ -421,7 +421,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/structure/window/reinforced{ @@ -435,7 +435,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/unsimulated/floor/plating, @@ -529,12 +529,12 @@ /turf/unsimulated/floor/laminate/broken6, /area/map_template/syndicate_mothership/raider_base) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/washing_machine, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 4 }, @@ -558,14 +558,14 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bS" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/unsimulated/floor/plating, @@ -1149,7 +1149,7 @@ "dB" = ( /obj/structure/rack, /obj/item/gun/launcher/bow/crossbow/powered, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/machinery/light/small{ dir = 8 }, diff --git a/mods/mobs/borers/mob/borer/borer_hud.dm b/mods/mobs/borers/mob/borer/borer_hud.dm index 084bacb7a160..8ec7b333971a 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -54,7 +54,7 @@ /obj/screen/borer/handle_click(mob/user, params) if(!isborer(user)) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.host) return FALSE return TRUE diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index d67a55ee4988..c8b05c70deb4 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -13,7 +13,7 @@ web.buckle_mob(hit_atom) web.visible_message(SPAN_DANGER("\The [hit_atom] is tangled in \the [web]!")) web.entangle(hit_atom, TRUE) - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) qdel(src) // Hey, did you ever see The Cube (1997) directed by Vincenzo Natali? @@ -68,7 +68,7 @@ START_PROCESSING(SSobj, src) /obj/effect/razorweb/proc/decay() - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel_self() /obj/effect/razorweb/attack_hand(mob/user) @@ -163,8 +163,8 @@ if(prob(break_chance)) visible_message(SPAN_DANGER("\The [src] breaks apart!")) - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel(src) else - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) break_chance = min(break_chance+10, 100) \ No newline at end of file diff --git a/mods/species/ascent/mobs/drone.dm b/mods/species/ascent/mobs/drone.dm index f2f94d499dea..2294585ee151 100644 --- a/mods/species/ascent/mobs/drone.dm +++ b/mods/species/ascent/mobs/drone.dm @@ -35,7 +35,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -96,7 +95,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 4c217a9aee0e..f8e5c45fd4a4 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -61,23 +61,22 @@ return molt = min(molt + 1, 5) - var/mob/living/simple_animal/alien/kharmaan/nymph = usr - nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") + visible_message("\icon[src] [src] begins to shimmy and shake out of its old skin.") if(molt == 5) - if(do_after(nymph, 10 SECONDS, nymph, FALSE)) - var/mob/living/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) - H.set_gyne_lineage(nymph.get_gyne_lineage()) + if(do_after(src, 10 SECONDS, src, FALSE)) + var/mob/living/human/H = new(get_turf(src), SPECIES_MANTID_ALATE) + H.set_gyne_lineage(get_gyne_lineage()) H.real_name = "[random_id(/decl/species/mantid, 10000, 99999)] [H.get_gyne_name()]" - H.nutrition = nymph.nutrition * 0.25 // Homgry after molt. - nymph.mind.transfer_to(H) - qdel(nymph) + H.nutrition = nutrition * 0.25 // Homgry after molt. + mind.transfer_to(H) + qdel(src) H.visible_message("\icon[H] [H] emerges from its molt as a new alate.") new/obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") + visible_message("\icon[src] [src] abruptly stops molting.") return - if(do_after(nymph, 5 SECONDS, nymph, FALSE)) + if(do_after(src, 5 SECONDS, src, FALSE)) var/matrix/M = matrix() M.Scale(1 + (molt / 10)) animate(src, transform = M, time = 2, easing = QUAD_EASING) @@ -88,4 +87,4 @@ new /obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") \ No newline at end of file + visible_message("\icon[src] [src] abruptly stops molting.") \ No newline at end of file diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm index b6c5366944c3..de0b3b76a702 100644 --- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -47,8 +47,5 @@ /obj/item/clothing/suit/space/void _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi' -/obj/item/clothing/suit/space/void/wizard - _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi' - /obj/item/clothing/suit/space/void/excavation _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi' diff --git a/mods/species/bayliens/unathi/datum/species_bodytypes.dm b/mods/species/bayliens/unathi/datum/species_bodytypes.dm index 33fef3a1188c..31e9a0584382 100644 --- a/mods/species/bayliens/unathi/datum/species_bodytypes.dm +++ b/mods/species/bayliens/unathi/datum/species_bodytypes.dm @@ -10,7 +10,7 @@ limb_icon_intensity = 0.7 health_hud_intensity = 2 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") movement_slowdown = 0.5 base_color = "#066000" appearance_flags = HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 12b6b2109d0d..e752bcde2f49 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -69,9 +69,6 @@ pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() -/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/human/H) - return null // todo: 'mods/species/drakes/icons/surgery.dmi' - // Stub for muscle memory of the Sit verb on Polaris. /mob/living/human/proc/drake_sit() set name = "Sit" diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea067..54f8feb36f05 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -28,6 +28,7 @@ eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' + surgery_overlay_icon = null // todo: 'mods/species/drakes/icons/surgery.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index e58789252fc0..86d5ae09208e 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -84,8 +84,8 @@ #undef SERPENTID_FLIGHT_PRESSURE_THRESHOLD /decl/species/serpentid/handle_environment_special(var/mob/living/human/H) - if(!H.on_fire && H.fire_stacks < 2) - H.fire_stacks += 0.2 + if(!H.is_on_fire() && H.get_fire_intensity() < 2) + H.adjust_fire_intensity(0.2) return /decl/species/serpentid/handle_fall_special(var/mob/living/human/H, var/turf/landing) diff --git a/mods/species/utility_frames/species_bodytypes.dm b/mods/species/utility_frames/species_bodytypes.dm index 5bd6e5e3a671..378c5d86f08b 100644 --- a/mods/species/utility_frames/species_bodytypes.dm +++ b/mods/species/utility_frames/species_bodytypes.dm @@ -10,7 +10,7 @@ body_flags = BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS base_color = "#333355" base_eye_color = "#00ccff" - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel vital_organs = list( BP_BRAIN, BP_CELL diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index 99bd0717bac5..83d61f50f51f 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -5,7 +5,6 @@ #include "mobs_vox.dm" #include "organs_vox.dm" #include "datum\accessories.dm" -#include "datum\antagonism.dm" #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm deleted file mode 100644 index 4b8c182ee3a0..000000000000 --- a/mods/species/vox/datum/antagonism.dm +++ /dev/null @@ -1,4 +0,0 @@ -// Wizard -/obj/item/magic_rock/Initialize(ml, material_key) - LAZYSET(potentials, SPECIES_VOX, /spell/targeted/shapeshift/true_form) - . = ..() diff --git a/mods/species/vox/gear/gun.dm b/mods/species/vox/gear/gun.dm index c4f62db86c9c..a2e5706de5d8 100644 --- a/mods/species/vox/gear/gun.dm +++ b/mods/species/vox/gear/gun.dm @@ -78,27 +78,3 @@ /decl/material/liquid/sedatives, /decl/material/liquid/paralytics ) - -/spell/targeted/shapeshift/true_form - name = "True Form" - desc = "Pay respect to your heritage. Become what you once were." - - school = "racial" - spell_flags = INCLUDEUSER - invocation_type = SpI_EMOTE - range = -1 - invocation = "begins to grow!" - charge_max = 1200 //2 minutes - duration = 300 //30 seconds - - smoke_amt = 5 - smoke_spread = 1 - - possible_transformations = list(/mob/living/simple_animal/hostile/parrot/space/lesser) - - hud_state = "wiz_vox" - - cast_sound = 'sound/voice/shriek1.ogg' - revert_sound = 'sound/voice/shriek1.ogg' - - drop_items = 0 diff --git a/nano/templates/deity.tmpl b/nano/templates/deity.tmpl deleted file mode 100644 index 5d1148e300e2..000000000000 --- a/nano/templates/deity.tmpl +++ /dev/null @@ -1,116 +0,0 @@ - -
-

Deity Menu

-
- {{:data.name}} the {{:data.form_name}} -
-
- Current Boon: - {{if data.boon_name}} - {{:data.boon_name}} - {{else}} - N/A - {{/if}} -
-
- Power: {{:data.power}} Power Minimum: {{:data.power_min}} Regen: {{:data.regen}} -
-
- {{:helper.link('Followers', 'person', {'switchMenu' : 0, 'menu' : 'menu'}, data.menu == 0 ? 'disabled' : null)}} - {{:helper.link('Shop', 'suitcase', {'switchMenu' : 1, 'menu' : 'menu'}, data.menu == 1 ? 'disabled' : null)}} - {{:helper.link('Phenomena', 'star', {'switchMenu' : 2, 'menu' : 'menu'}, data.menu == 2 ? 'disabled' : null)}} -
-
-{{if data.menu == 0}} -

Followers

- {{for data.followers}} -
- {{:value.name}} -
-
- {{:helper.link('Jump', 'zoomin', {'jump' : value.ref}, value.ref ? null : 'disabled')}} - {{:helper.link('Follow', 'zoomout', {'jump' : value.ref, 'follow' : 1}, value.ref ? null : 'disabled')}} -
- {{empty}} - You have no minions! - {{/for}} -{{else data.menu == 1}} -

Shop

-
- {{for data.categories}} - {{:helper.link(value, null, {'switchCategory' : index}, index == data.category ? 'disabled' : null)}} - {{/for}} -
-
- {{for data.item_data}} -
-
- {{:helper.link(value.name, null, {'buy' : value.ref})}} (Level {{:value.level}}) -
-
- Costs: {{:value.cost}} Requires: {{:value.requirements}} -
-
- {{:value.desc}} -
-
- {{empty}} - There is nothing there! - {{/for}} -{{else data.menu == 2}} -

Phenomena

-
-
- Selected Phenomena: -
-
- {{if data.selectedPhenomenaName}} - {{:helper.link(data.selectedPhenomenaName, null, {'clear_selected' : 1})}} - {{else}} - N/A - {{/if}} -
-
-
- {{:helper.link('Phenomena', 'star', {'switchMenu' : 0, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 0 ? 'disabled' : null)}} - {{:helper.link('Bindings', 'key', {'switchMenu' : 1, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 1 ? 'disabled' : null)}} -
- {{if data.phenomenaMenu == 0}} - {{for data.phenomena}} -
-
- {{:helper.link(value.name, null, {'select_phenomena' : value.name})}} -
-
- Use Cost: {{:value.cost}} - {{if value.cooldown}} - Cooldown: {{:value.cooldown}} - {{/if}} -
-
- {{:value.description}} -
-
- {{empty}} - You don't have any phenomena! - {{/for}} - {{else data.phenomenaMenu == 1}} - {{for data.bindings}} -

{{:value.intent}}

- {{for value.intent_data :intentValue:intentKey}} -
-
- {{:intentValue.binding}} -
-
- {{:helper.link(intentValue.phenomena_name ? intentValue.phenomena_name : 'N/A', null, {'select_intent' : value.intent, 'select_binding' : intentValue.binding})}} -
-
- {{/for}} -
- {{/for}} - {{/if}} -{{/if}} -
\ No newline at end of file diff --git a/nebula.dme b/nebula.dme index f48ac3c7285b..70bbe82cb211 100644 --- a/nebula.dme +++ b/nebula.dme @@ -122,6 +122,7 @@ #include "code\_global_vars\sound.dm" #include "code\_global_vars\lists\clothing.dm" #include "code\_global_vars\lists\flavor.dm" +#include "code\_global_vars\lists\jewellery.dm" #include "code\_global_vars\lists\logs.dm" #include "code\_global_vars\lists\mapping.dm" #include "code\_global_vars\lists\names.dm" @@ -240,8 +241,6 @@ #include "code\controllers\communications.dm" #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" @@ -283,6 +282,7 @@ #include "code\controllers\subsystems\mapping.dm" #include "code\controllers\subsystems\misc_late.dm" #include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\pathfinding.dm" #include "code\controllers\subsystems\plants.dm" #include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\shuttle.dm" @@ -357,7 +357,13 @@ #include "code\datums\type_cloning.dm" #include "code\datums\weakref.dm" #include "code\datums\ai\_ai.dm" +#include "code\datums\ai\_ai_enemies.dm" +#include "code\datums\ai\_ai_friends.dm" +#include "code\datums\ai\_ai_memory.dm" +#include "code\datums\ai\_ai_pathfinding.dm" #include "code\datums\ai\_ai_stance.dm" +#include "code\datums\ai\_ai_targets.dm" +#include "code\datums\ai\_ai_wander.dm" #include "code\datums\ai\aggressive.dm" #include "code\datums\ai\beast.dm" #include "code\datums\ai\commanded.dm" @@ -450,7 +456,6 @@ #include "code\datums\extensions\eye\landing.dm" #include "code\datums\extensions\holster\holster.dm" #include "code\datums\extensions\milkable\milkable.dm" -#include "code\datums\extensions\multitool\_multitool.dm" #include "code\datums\extensions\multitool\multitool.dm" #include "code\datums\extensions\multitool\store.dm" #include "code\datums\extensions\multitool\circuitboards\buildtype_select.dm" @@ -615,7 +620,6 @@ #include "code\datums\proximity_trigger\proximity_trigger.dm" #include "code\datums\proximity_trigger\turf_selection.dm" #include "code\datums\repositories\_defines.dm" -#include "code\datums\repositories\admin_pm.dm" #include "code\datums\repositories\areas.dm" #include "code\datums\repositories\atom_info.dm" #include "code\datums\repositories\attack_logs.dm" @@ -735,6 +739,7 @@ #include "code\game\atom_material.dm" #include "code\game\atoms.dm" #include "code\game\atoms_damage.dm" +#include "code\game\atoms_fires.dm" #include "code\game\atoms_fluids.dm" #include "code\game\atoms_init.dm" #include "code\game\atoms_layering.dm" @@ -765,7 +770,6 @@ #include "code\game\antagonist\outsider\actors.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\thrall.dm" #include "code\game\area\area_abstract.dm" @@ -801,14 +805,6 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\gamemodes\wizard\wizard_props.dm" -#include "code\game\gamemodes\wizard\servant_items\caretaker.dm" -#include "code\game\gamemodes\wizard\servant_items\champion.dm" -#include "code\game\gamemodes\wizard\servant_items\familiar.dm" -#include "code\game\gamemodes\wizard\servant_items\fiend.dm" -#include "code\game\gamemodes\wizard\servant_items\infiltrator.dm" -#include "code\game\gamemodes\wizard\servant_items\overseer.dm" #include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" @@ -842,7 +838,6 @@ #include "code\game\machinery\igniter.dm" #include "code\game\machinery\jukebox.dm" #include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mech_recharger.dm" #include "code\game\machinery\message_server.dm" @@ -1016,11 +1011,8 @@ #include "code\game\objects\objs_interactions.dm" #include "code\game\objects\topic.dm" #include "code\game\objects\auras\aura.dm" -#include "code\game\objects\auras\blueforge_aura.dm" #include "code\game\objects\auras\radiant_aura.dm" #include "code\game\objects\auras\regenerating_aura.dm" -#include "code\game\objects\auras\shadowling_aura.dm" -#include "code\game\objects\auras\starlight.dm" #include "code\game\objects\auras\personal_shields\personal_shield.dm" #include "code\game\objects\compass\_compass.dm" #include "code\game\objects\compass\compass_holder.dm" @@ -1047,7 +1039,7 @@ #include "code\game\objects\effects\portals.dm" #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\temporaray.dm" +#include "code\game\objects\effects\temporary.dm" #include "code\game\objects\effects\temporary_effect.dm" #include "code\game\objects\effects\wet_floor.dm" #include "code\game\objects\effects\wormhole.dm" @@ -1086,6 +1078,7 @@ #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\buttons.dm" +#include "code\game\objects\items\candelabra.dm" #include "code\game\objects\items\christmas.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crutches.dm" @@ -1108,10 +1101,10 @@ #include "code\game\objects\items\rescuebag.dm" #include "code\game\objects\items\rock.dm" #include "code\game\objects\items\saddle.dm" -#include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\silencer.dm" #include "code\game\objects\items\spirit_board.dm" #include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\training_dummy.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\umbrella.dm" #include "code\game\objects\items\waterskin.dm" @@ -1260,7 +1253,6 @@ #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\secrets_disk.dm" #include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\soap.dm" @@ -1426,6 +1418,7 @@ #include "code\game\objects\structures\_structure_icon.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" +#include "code\game\objects\structures\armor_stand.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1440,6 +1433,7 @@ #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\defensive_barrier.dm" #include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divider.dm" #include "code\game\objects\structures\dogbed.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\double_sign.dm" @@ -1457,9 +1451,11 @@ #include "code\game\objects\structures\fountain.dm" #include "code\game\objects\structures\fuel_port.dm" #include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grandfather_clock.dm" #include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\hand_cart.dm" #include "code\game\objects\structures\handrail.dm" +#include "code\game\objects\structures\hay.dm" #include "code\game\objects\structures\holosigns.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\ironing_board.dm" @@ -1478,6 +1474,7 @@ #include "code\game\objects\structures\racks.dm" #include "code\game\objects\structures\railing.dm" #include "code\game\objects\structures\rubble.dm" +#include "code\game\objects\structures\rug.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\seaweed.dm" #include "code\game\objects\structures\showcase.dm" @@ -1572,6 +1569,7 @@ #include "code\game\turfs\turf_footsteps.dm" #include "code\game\turfs\turf_height.dm" #include "code\game\turfs\turf_material.dm" +#include "code\game\turfs\turf_navigation.dm" #include "code\game\turfs\turf_ramps.dm" #include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\flooring\_flooring.dm" @@ -1636,6 +1634,7 @@ #include "code\game\turfs\walls\wall_natural_subtypes.dm" #include "code\game\turfs\walls\wall_natural_xenoarch.dm" #include "code\game\turfs\walls\wall_types.dm" +#include "code\game\turfs\walls\wall_wattle.dm" #include "code\game\verbs\byond_membership.dm" #include "code\game\verbs\ignore.dm" #include "code\game\verbs\ooc.dm" @@ -1712,7 +1711,6 @@ #include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" #include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" #include "code\modules\admin\secrets\fun_secrets\waddle.dm" -#include "code\modules\admin\secrets\investigation\admin_pms.dm" #include "code\modules\admin\secrets\investigation\attack_logs.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -1841,6 +1839,15 @@ #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" #include "code\modules\blood\blood_types_subtypes.dm" +#include "code\modules\bodytype\_bodytype.dm" +#include "code\modules\bodytype\bodytype_abilities.dm" +#include "code\modules\bodytype\bodytype_crystalline.dm" +#include "code\modules\bodytype\bodytype_helpers.dm" +#include "code\modules\bodytype\bodytype_offsets.dm" +#include "code\modules\bodytype\bodytype_prosthetic.dm" +#include "code\modules\bodytype\bodytype_prosthetic_models.dm" +#include "code\modules\bodytype\bodytype_quadruped.dm" +#include "code\modules\bodytype\bodytype_random.dm" #include "code\modules\brain_interface\_brain_interface.dm" #include "code\modules\brain_interface\interface_radio.dm" #include "code\modules\butchery\_butchery.dm" @@ -1991,8 +1998,10 @@ #include "code\modules\clothing\gloves\thick.dm" #include "code\modules\clothing\gloves\jewelry\bracelet.dm" #include "code\modules\clothing\gloves\jewelry\rings\_ring.dm" -#include "code\modules\clothing\gloves\jewelry\rings\material.dm" -#include "code\modules\clothing\gloves\jewelry\rings\rings.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_aura.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_misc.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_reagent.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_seal.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\earmuffs.dm" @@ -2005,6 +2014,7 @@ #include "code\modules\clothing\head\misc_special.dm" #include "code\modules\clothing\head\security.dm" #include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\wizard.dm" #include "code\modules\clothing\jumpsuits\_jumpsuit.dm" #include "code\modules\clothing\jumpsuits\color.dm" #include "code\modules\clothing\jumpsuits\job.dm" @@ -2027,10 +2037,16 @@ #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\neck\bowties.dm" #include "code\modules\clothing\neck\brace.dm" -#include "code\modules\clothing\neck\jewelry.dm" +#include "code\modules\clothing\neck\prayer_beads.dm" #include "code\modules\clothing\neck\scarf.dm" #include "code\modules\clothing\neck\stethoscope.dm" #include "code\modules\clothing\neck\ties.dm" +#include "code\modules\clothing\neck\necklace\__necklace.dm" +#include "code\modules\clothing\neck\necklace\_pendant.dm" +#include "code\modules\clothing\neck\necklace\necklaces.dm" +#include "code\modules\clothing\neck\necklace\pendant_locket.dm" +#include "code\modules\clothing\neck\necklace\pendant_random.dm" +#include "code\modules\clothing\neck\necklace\pendant_setting.dm" #include "code\modules\clothing\pants\_pants.dm" #include "code\modules\clothing\pants\detective.dm" #include "code\modules\clothing\pants\misc.dm" @@ -2095,7 +2111,6 @@ #include "code\modules\clothing\spacesuits\void\misc.dm" #include "code\modules\clothing\spacesuits\void\station.dm" #include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" #include "code\modules\clothing\suits\_suit.dm" #include "code\modules\clothing\suits\_suit_hood.dm" #include "code\modules\clothing\suits\alien.dm" @@ -2106,6 +2121,7 @@ #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" #include "code\modules\clothing\suits\mantle.dm" +#include "code\modules\clothing\suits\misc.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\poncho.dm" #include "code\modules\clothing\suits\robes.dm" @@ -2114,7 +2130,7 @@ #include "code\modules\clothing\suits\straightjacket.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\wizard.dm" #include "code\modules\clothing\suits\armor\_armor.dm" #include "code\modules\clothing\suits\armor\adminbus_and_memes.dm" #include "code\modules\clothing\suits\armor\bulletproof.dm" @@ -2192,6 +2208,7 @@ #include "code\modules\codex\entries\tools.dm" #include "code\modules\codex\entries\turfs.dm" #include "code\modules\codex\entries\weapons.dm" +#include "code\modules\crafting\handmade_fancy.dm" #include "code\modules\crafting\handmade_items.dm" #include "code\modules\crafting\metalwork\metalwork_items.dm" #include "code\modules\crafting\pottery\pottery_moulds.dm" @@ -2218,6 +2235,7 @@ #include "code\modules\crafting\stack_recipes\recipes_bricks.dm" #include "code\modules\crafting\stack_recipes\recipes_cardstock.dm" #include "code\modules\crafting\stack_recipes\recipes_coins.dm" +#include "code\modules\crafting\stack_recipes\recipes_fodder.dm" #include "code\modules\crafting\stack_recipes\recipes_grass.dm" #include "code\modules\crafting\stack_recipes\recipes_hardness.dm" #include "code\modules\crafting\stack_recipes\recipes_hardness_integrity.dm" @@ -2227,10 +2245,10 @@ #include "code\modules\crafting\stack_recipes\recipes_panels.dm" #include "code\modules\crafting\stack_recipes\recipes_planks.dm" #include "code\modules\crafting\stack_recipes\recipes_reinforced.dm" +#include "code\modules\crafting\stack_recipes\recipes_rods.dm" #include "code\modules\crafting\stack_recipes\recipes_soft.dm" #include "code\modules\crafting\stack_recipes\recipes_stacks.dm" #include "code\modules\crafting\stack_recipes\recipes_steel.dm" -#include "code\modules\crafting\stack_recipes\recipes_struts.dm" #include "code\modules\crafting\stack_recipes\recipes_textiles.dm" #include "code\modules\crafting\stack_recipes\recipes_turfs.dm" #include "code\modules\crafting\working\_working.dm" @@ -2238,6 +2256,10 @@ #include "code\modules\crafting\working\textiles\loom.dm" #include "code\modules\crafting\working\textiles\spinning_wheel.dm" #include "code\modules\crafting\working\textiles\twisting_bench.dm" +#include "code\modules\decoration\_decoration.dm" +#include "code\modules\decoration\decoration_inset.dm" +#include "code\modules\decoration\decoration_item.dm" +#include "code\modules\decoration\decoration_setting.dm" #include "code\modules\departments\department.dm" #include "code\modules\detectivework\forensics.dm" #include "code\modules\detectivework\evidence\_evidence_holder.dm" @@ -2296,7 +2318,6 @@ #include "code\modules\emotes\definitions\tail.dm" #include "code\modules\emotes\definitions\visible.dm" #include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_reporting.dm" #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\events\ailments.dm" #include "code\modules\events\apc_damage.dm" @@ -2339,7 +2360,6 @@ #include "code\modules\events\trivial_news.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\events\wormholes.dm" -#include "code\modules\ext_scripts\irc.dm" #include "code\modules\fabrication\__fabricator_defines.dm" #include "code\modules\fabrication\_fabricator.dm" #include "code\modules\fabrication\_fabricator_build_order.dm" @@ -2456,6 +2476,8 @@ #include "code\modules\games\cards_cag.dm" #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\gemstones\_gemstone.dm" +#include "code\modules\gemstones\gemstone_cuts.dm" #include "code\modules\genetics\_gene.dm" #include "code\modules\genetics\plants\_gene_plant.dm" #include "code\modules\genetics\plants\_plant_trait.dm" @@ -2629,7 +2651,6 @@ #include "code\modules\item_effects\item_effect_charges.dm" #include "code\modules\item_effects\item_effect_debug.dm" #include "code\modules\item_effects\item_effect_item.dm" -#include "code\modules\item_worth\_helpers.dm" #include "code\modules\keybindings\_defines.dm" #include "code\modules\keybindings\_keybindings.dm" #include "code\modules\keybindings\admin.dm" @@ -2854,6 +2875,7 @@ #include "code\modules\mob\living\living_dreams.dm" #include "code\modules\mob\living\living_eating.dm" #include "code\modules\mob\living\living_electrocution.dm" +#include "code\modules\mob\living\living_fires.dm" #include "code\modules\mob\living\living_genetics.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" @@ -3003,7 +3025,6 @@ #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" -#include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\corgi.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" @@ -3089,9 +3110,6 @@ #include "code\modules\mob\observer\eye\freelook\ai\update_triggers.dm" #include "code\modules\mob\observer\ghost\follow.dm" #include "code\modules\mob\observer\ghost\ghost.dm" -#include "code\modules\mob\observer\ghost\login.dm" -#include "code\modules\mob\observer\ghost\logout.dm" -#include "code\modules\mob\observer\ghost\say.dm" #include "code\modules\mob\observer\virtual\_constants.dm" #include "code\modules\mob\observer\virtual\base.dm" #include "code\modules\mob\observer\virtual\helpers.dm" @@ -3273,6 +3291,7 @@ #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\organs\_organ_setup.dm" #include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_prosthetics.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\ailments\_ailment.dm" #include "code\modules\organs\ailments\ailment_codex.dm" @@ -3312,9 +3331,6 @@ #include "code\modules\organs\internal\stomach.dm" #include "code\modules\organs\internal\voice.dm" #include "code\modules\organs\internal\species\golem.dm" -#include "code\modules\organs\prosthetics\_prosthetics.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer_models.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\_overmap.dm" #include "code\modules\overmap\overmap_object.dm" @@ -3750,104 +3766,25 @@ #include "code\modules\species\species.dm" #include "code\modules\species\species_allergies.dm" #include "code\modules\species\species_attack.dm" -#include "code\modules\species\species_bodytype.dm" -#include "code\modules\species\species_bodytype_abilities.dm" -#include "code\modules\species\species_bodytype_helpers.dm" -#include "code\modules\species\species_bodytype_offsets.dm" -#include "code\modules\species\species_bodytype_quadruped.dm" -#include "code\modules\species\species_bodytype_random.dm" -#include "code\modules\species\species_crystalline_bodytypes.dm" #include "code\modules\species\species_getters.dm" #include "code\modules\species\species_helpers.dm" #include "code\modules\species\species_hud.dm" #include "code\modules\species\species_shapeshifter.dm" #include "code\modules\species\species_shapeshifter_bodytypes.dm" #include "code\modules\species\outsider\random.dm" -#include "code\modules\species\outsider\shadow.dm" -#include "code\modules\species\outsider\starlight.dm" #include "code\modules\species\station\golem.dm" #include "code\modules\species\station\human.dm" #include "code\modules\species\station\human_bodytypes.dm" #include "code\modules\species\station\monkey.dm" #include "code\modules\species\station\monkey_bodytypes.dm" -#include "code\modules\spells\artifacts.dm" #include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\contracts.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\racial_wizard.dm" #include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" #include "code\modules\spells\spells.dm" #include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\drain_blood.dm" -#include "code\modules\spells\aoe_turf\exchange_wounds.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" #include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\druidic_spells.dm" -#include "code\modules\spells\aoe_turf\conjure\faithful_hound.dm" -#include "code\modules\spells\aoe_turf\conjure\force_portal.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\aoe_turf\conjure\grove.dm" -#include "code\modules\spells\artifacts\spellbound_servants.dm" -#include "code\modules\spells\artifacts\storage.dm" -#include "code\modules\spells\general\acid_spray.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\camera_vision.dm" -#include "code\modules\spells\general\contract_spells.dm" -#include "code\modules\spells\general\create_air.dm" -#include "code\modules\spells\general\invisibility.dm" -#include "code\modules\spells\general\mark_recall.dm" -#include "code\modules\spells\general\portal_teleport.dm" -#include "code\modules\spells\general\radiant_aura.dm" -#include "code\modules\spells\general\return_master.dm" -#include "code\modules\spells\general\toggle_armor.dm" -#include "code\modules\spells\hand\blood_shards.dm" -#include "code\modules\spells\hand\burning_grip.dm" -#include "code\modules\spells\hand\entangle.dm" -#include "code\modules\spells\hand\hand.dm" -#include "code\modules\spells\hand\hand_item.dm" -#include "code\modules\spells\hand\slippery_surface.dm" -#include "code\modules\spells\hand\sunwrath.dm" -#include "code\modules\spells\spellbook\battlemage.dm" -#include "code\modules\spells\spellbook\cleric.dm" -#include "code\modules\spells\spellbook\druid.dm" -#include "code\modules\spells\spellbook\spatial.dm" -#include "code\modules\spells\spellbook\standard.dm" -#include "code\modules\spells\spellbook\student.dm" -#include "code\modules\spells\targeted\analyze.dm" -#include "code\modules\spells\targeted\blood_boil.dm" -#include "code\modules\spells\targeted\cleric_spells.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\exude_pleasantness.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\glimpse_of_eternity.dm" -#include "code\modules\spells\targeted\shapeshift.dm" -#include "code\modules\spells\targeted\shatter_mind.dm" #include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\swap.dm" #include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\torment.dm" -#include "code\modules\spells\targeted\equip\burning_touch.dm" -#include "code\modules\spells\targeted\equip\dyrnwyn.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\holy_relic.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\equip\party_hardy.dm" -#include "code\modules\spells\targeted\equip\seed.dm" -#include "code\modules\spells\targeted\equip\shield.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\passage.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\spells\targeted\projectile\stuncuff.dm" #include "code\modules\sprite_accessories\_accessory.dm" #include "code\modules\sprite_accessories\_accessory_category.dm" #include "code\modules\sprite_accessories\cosmetics\_accessory_cosmetics.dm" @@ -4067,9 +4004,9 @@ #include "code\modules\ZAS\Variable Settings.dm" #include "code\modules\ZAS\Zone.dm" #include "code\procs\announce.dm" -#include "code\procs\AStar.dm" #include "code\procs\dbcore.dm" #include "code\procs\hud.dm" +#include "code\procs\pathfinding.dm" #include "code\procs\radio.dm" #include "code\unit_tests\_defines.dm" #include "code\unit_tests\_includes.dm" @@ -4123,7 +4060,6 @@ #include "maps\_map_include.dm" #include "maps\antag_spawn\ert\ert.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" -#include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" #include "maps\exodus\exodus_define.dm" diff --git a/test/check-paths.sh b/test/check-paths.sh index 161216458247..dcf902b9335e 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -24,7 +24,7 @@ exactly() { # exactly N name search [mode] [filter] # With the potential exception of << if you increase any of these numbers you're probably doing it wrong # Additional exception August 2020: \b is a regex symbol as well as a BYOND macro. exactly 1 "escapes" '\\\\(red|blue|green|black|b|i[^mc])' -exactly 6 "Del()s" '\WDel\(' +exactly 8 "Del()s" '\WDel\(' exactly 2 "/atom text paths" '"/atom' exactly 2 "/area text paths" '"/area' exactly 2 "/datum text paths" '"/datum' @@ -32,12 +32,12 @@ exactly 2 "/mob text paths" '"/mob' exactly 6 "/obj text paths" '"/obj' exactly 10 "/turf text paths" '"/turf' exactly 1 "world<< uses" 'world<<|world[[:space:]]<<' -exactly 93 "'in world' uses" 'in world' +exactly 90 "'in world' uses" 'in world' exactly 1 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<' exactly 18 "<< uses" '(?> uses" '>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 24 "text2path uses" 'text2path' +exactly 22 "text2path uses" 'text2path' exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P exactly 0 "goto uses" 'goto ' exactly 9 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' @@ -47,7 +47,7 @@ exactly 3 "unmarked globally scoped variables" '^(/|)var/(?!global)' -P exactly 0 "global-marked member variables" '\t(/|)var.*/global/.+' -P exactly 0 "static-marked globally scoped variables" '^(/|)var.*/static/.+' -P exactly 1 "direct usage of decls_repository.get_decl()" 'decls_repository\.get_decl\(' -P -exactly 20 "direct loc set" '(\t|;|\.)loc\s*=(?!=)' -P +exactly 19 "direct loc set" '(\t|;|\.)loc\s*=(?!=)' -P exactly 0 "magic number mouse opacity set" 'mouse_opacity\s*=\s*[0-2]' -P exactly 1 "magic number density set" '\bdensity\s*=\s*[01]' -P exactly 0 "magic number anchored set" '\banchored\s*=\s*[01]' -P diff --git a/tools/map_migrations/4615_target_stakes.txt b/tools/map_migrations/4615_target_stakes.txt new file mode 100644 index 000000000000..8e4677a219f1 --- /dev/null +++ b/tools/map_migrations/4615_target_stakes.txt @@ -0,0 +1,2 @@ +/obj/item/target/@SUBTYPES : /obj/item/target_dummy/@SUBTYPES{@OLD} +/obj/structure/target_stake/@SUBTYPES : /obj/structure/target_stake/steel/@SUBTYPES{@OLD} diff --git a/tools/map_migrations/4647_dirt.txt b/tools/map_migrations/4647_dirt.txt new file mode 100644 index 000000000000..262db2c52ce3 --- /dev/null +++ b/tools/map_migrations/4647_dirt.txt @@ -0,0 +1,2 @@ +/obj/effect/decal/cleanable/dirt/@SUBTYPES : /obj/effect/decal/cleanable/dirt/visible/@SUBTYPES{@OLD} + diff --git a/tools/map_migrations/4651_rods.txt b/tools/map_migrations/4651_rods.txt new file mode 100644 index 000000000000..e7d5bffba5e9 --- /dev/null +++ b/tools/map_migrations/4651_rods.txt @@ -0,0 +1,2 @@ +/obj/item/stack/material/rods/@SUBTYPES : /obj/item/stack/material/rods/mapped/steel/@SUBTYPES{@OLD} + diff --git a/~code/global_init.dm b/~code/global_init.dm index 00301af2ca2b..82950bb246da 100644 --- a/~code/global_init.dm +++ b/~code/global_init.dm @@ -15,7 +15,8 @@ var/global_init = new /datum/global_init() /datum/global_init/New() SSconfiguration.load_all_configuration() - callHook("global_init") + generate_game_id() + makeDatumRefLists() qdel(src) //we're done /datum/global_init/Destroy()