diff --git a/.travis.yml b/.travis.yml index b353761b2d..3095262290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,15 +21,12 @@ cache: addons: apt: - sources: - - sourceline: 'ppa:ondrej/php' packages: - libc6-i386 - libgcc1:i386 - libstdc++6:i386 - python - python-pip - - php5.6 install: - tools/travis/install_build_tools.sh diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index dd5a25d8ff..a2aa7b1414 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -135,3 +135,26 @@ #define NOAROUSAL 29 //Stops all arousal effects #define NOGENITALS 30 //Cannot create, use, or otherwise have genitals #define NO_DNA_COPY 31 +#define DRINKSBLOOD 32 + +#define ORGAN_SLOT_BRAIN "brain" +#define ORGAN_SLOT_APPENDIX "appendix" +#define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device" +#define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" +#define ORGAN_SLOT_STOMACH "stomach" +#define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" +#define ORGAN_SLOT_EARS "ears" +#define ORGAN_SLOT_EYES "eye_sight" +#define ORGAN_SLOT_LUNGS "lungs" +#define ORGAN_SLOT_HEART "heart" +#define ORGAN_SLOT_ZOMBIE "zombie_infection" +#define ORGAN_SLOT_THRUSTERS "thrusters" +#define ORGAN_SLOT_HUD "eye_hud" +#define ORGAN_SLOT_LIVER "liver" +#define ORGAN_SLOT_TONGUE "tongue" +#define ORGAN_SLOT_VOICE "vocal_cords" +#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator" +#define ORGAN_SLOT_HEART_AID "heartdrive" +#define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" +#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" +#define ORGAN_SLOT_TAIL "tail" diff --git a/code/__DEFINES/radiation.dm b/code/__DEFINES/radiation.dm index 196f3cc079..3e9731417a 100644 --- a/code/__DEFINES/radiation.dm +++ b/code/__DEFINES/radiation.dm @@ -6,29 +6,30 @@ Ask ninjanomnom if they're around #define RAD_BACKGROUND_RADIATION 9 // How much radiation is harmless to a mob, this is also when radiation waves stop spreading // WARNING: Lowering this value significantly increases SSradiation load -#define RAD_AMOUNT_LOW 50 -#define RAD_AMOUNT_MEDIUM 200 -#define RAD_AMOUNT_HIGH 500 -#define RAD_AMOUNT_EXTREME 1000 -// apply_effect(amount * RAD_MOB_COEFFICIENT, IRRADIATE, blocked) -#define RAD_MOB_COEFFICIENT 0.25 // Radiation applied is multiplied by this +// apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), IRRADIATE, blocked) +#define RAD_MOB_COEFFICIENT 0.20 // Radiation applied is multiplied by this +#define RAD_MOB_SKIN_PROTECTION ((1/RAD_MOB_COEFFICIENT)+RAD_BACKGROUND_RADIATION) -#define RAD_LOSS_PER_TICK 1 +#define RAD_LOSS_PER_TICK 0.5 #define RAD_TOX_COEFFICIENT 0.05 // Toxin damage per tick coefficient +#define RAD_OVERDOSE_REDUCTION 0.000001 // Coefficient to the reduction in applied rads once the thing, usualy mob, has too much radiation + // WARNING: This number is highly sensitive to change, graph is first for best results +#define RAD_BURN_THRESHOLD 1000 // Applied radiation must be over this to burn -#define RAD_MOB_SAFE 300 // How much stored radiation in a mob with no ill effects +#define RAD_MOB_SAFE 500 // How much stored radiation in a mob with no ill effects + +#define RAD_MOB_HAIRLOSS 800 // How much stored radiation to check for hair loss + +#define RAD_MOB_MUTATE 1250 // How much stored radiation to check for mutation + +#define RAD_MOB_VOMIT 2000 // The amount of radiation to check for vomitting +#define RAD_MOB_VOMIT_PROB 1 // Chance per tick of vomitting #define RAD_MOB_KNOCKDOWN 2000 // How much stored radiation to check for stunning #define RAD_MOB_KNOCKDOWN_PROB 1 // Chance of knockdown per tick when over threshold #define RAD_MOB_KNOCKDOWN_AMOUNT 3 // Amount of knockdown when it occurs -#define RAD_MOB_VOMIT 1500 // The amount of radiation to check for vomitting -#define RAD_MOB_VOMIT_PROB 1 // Chance per tick of vomitting - -#define RAD_MOB_MUTATE 1000 // How much stored radiation to check for mutation -#define RAD_MOB_HAIRLOSS 500 // How much stored radiation to check for hair loss - #define RAD_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason #define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have #define RAD_LIGHT_INSULATION 0.8 @@ -39,10 +40,10 @@ Ask ninjanomnom if they're around // WARNING: The deines below could have disastrous consequences if tweaked incorrectly. See: The great SM purge of Oct.6.2017 // contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1)) -// contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1) -#define RAD_MINIMUM_CONTAMINATION 300 // How strong does a radiation wave have to be to contaminate objects -#define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.0075 // Higher means higher strength scaling contamination chance -#define RAD_CONTAMINATION_STR_COEFFICIENT 0.5 // Higher means higher strength scaling contamination strength +// contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT +#define RAD_MINIMUM_CONTAMINATION 350 // How strong does a radiation wave have to be to contaminate objects +#define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.005 // Higher means higher strength scaling contamination chance +#define RAD_CONTAMINATION_STR_COEFFICIENT 0.3 // Higher means higher strength scaling contamination strength #define RAD_DISTANCE_COEFFICIENT 1 // Lower means further rad spread -#define RAD_HALF_LIFE 150 // The half-life of contaminated objects \ No newline at end of file +#define RAD_HALF_LIFE 90 // The half-life of contaminated objects \ No newline at end of file diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 9ec26b7506..247e1109f8 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -46,8 +46,8 @@ #define INIT_ORDER_DBCORE 18 #define INIT_ORDER_BLACKBOX 17 #define INIT_ORDER_SERVER_MAINT 16 -#define INIT_ORDER_JOBS 15 -#define INIT_ORDER_EVENTS 14 +#define INIT_ORDER_EVENTS 15 +#define INIT_ORDER_JOBS 14 #define INIT_ORDER_TICKER 13 #define INIT_ORDER_MAPPING 12 #define INIT_ORDER_ATOMS 11 diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index dbb548a6a5..a939ab7e90 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -67,3 +67,4 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_profile_count_dsc(list/A, list/B) return B[PROFILE_ITEM_COUNT] - A[PROFILE_ITEM_COUNT] + diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index 7cd3a1bbeb..8418cc8505 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -1,28 +1,28 @@ -/proc/get_rad_contents(atom/location, list/output=list()) // A special GetAllContents that doesn't search past things with rad insulation - . = output - - if(!location) - return - - output += location - - var/datum/component/rad_insulation/insulation = location.GetComponent(/datum/component/rad_insulation) - if(insulation && insulation.protects) - return - - for(var/i in 1 to location.contents.len) - var/static/list/ignored_things = typecacheof(list( // These types will never have radiation applied to them or be looked inside of +// A special GetAllContents that doesn't search past things with rad insulation +// The protection var only protects the things inside from being affected. +// The protecting object itself will get returned still. +// The ignore list makes those objects never return at all +/proc/get_rad_contents(atom/location) + var/list/processing_list = list(location) + . = list() + while(processing_list.len) + var/static/list/ignored_things = typecacheof(list( /mob/dead, /mob/camera, /obj/effect, /obj/docking_port, - /atom/movable/lighting_object + /atom/movable/lighting_object, + /obj/item/projectile )) - - var/atom/thing = location.contents[i] + var/atom/thing = processing_list[1] + processing_list -= thing if(ignored_things[thing.type]) continue - get_rad_contents(thing, output) + . += thing + var/datum/component/rad_insulation/insulation = thing.GetComponent(/datum/component/rad_insulation) + if(insulation && insulation.protects) + continue + processing_list += thing.contents /proc/radiation_pulse(atom/source, intensity, range_modifier, log=FALSE, can_contaminate=TRUE) if(!SSradiation.can_fire) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 1c1ad2e692..1f20614c17 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -5,8 +5,10 @@ #ifdef TESTING //#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing. - //Also allows for recursive reference searching of datums. - //Sets world.loop_checks to false and prevents find references from sleeping + //implies FIND_REF_NO_CHECK_TICK + +//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping + //#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green #endif @@ -58,6 +60,11 @@ #warn compiling in TESTING mode. testing() debug messages will be visible. #endif + +#ifdef GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif + #ifdef TRAVISTESTING #define TESTING #endif diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 7cddaf9a6f..79271d1d6d 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -251,7 +251,7 @@ to_chat(C, "You are no longer running on internals.") icon_state = "internal0" else - if(!C.getorganslot("breathing_tube")) + if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) if(!istype(C.wear_mask, /obj/item/clothing/mask)) to_chat(C, "You are not wearing an internals mask!") return 1 diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm index 9ac58122fe..f3db31c228 100644 --- a/code/citadel/_cit_helpers.dm +++ b/code/citadel/_cit_helpers.dm @@ -26,7 +26,7 @@ proc/get_racelist(var/mob/user)//This proc returns a list of species that 'user' var/list/wlist = S.whitelist if(S.whitelisted && (wlist.Find(user.ckey) || wlist.Find(user.key) || user.client.holder)) //If your ckey is on the species whitelist or you're an admin: GLOB.whitelisted_species_list[S.id] = S.type //Add the species to their available species list. - else if(!S.whitelisted && S.roundstart) //Normal roundstart species will be handled here. + else if(!S.whitelisted) //Normal roundstart species will be handled here. GLOB.whitelisted_species_list[S.id] = S.type return GLOB.whitelisted_species_list diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index f2c9cd3315..ea79ba81f3 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -110,29 +110,7 @@ CONFIG_DEF(number/shuttle_refuel_delay) CONFIG_DEF(flag/show_game_type_odds) //if set this allows players to see the odds of each roundtype on the get revision screen -CONFIG_DEF(flag/join_with_mutant_race) //players can choose their mutant race before joining the game - -CONFIG_DEF(keyed_flag_list/roundstart_races) //races you can play as from the get go. If left undefined the game's roundstart var for species is used - var/first_edit = TRUE - -/datum/config_entry/keyed_flag_list/roundstart_races/New() - for(var/I in subtypesof(/datum/species)) - var/datum/species/S = I - if(initial(S.roundstart)) - value[initial(S.id)] = TRUE - ..() - -/datum/config_entry/keyed_flag_list/roundstart_races/ValidateAndSet(str_val) - var/list/old_val - if(first_edit) - old_val = value - old_val = old_val.Copy() - . = ..() - if(first_edit) - if(!.) - value = old_val - else - first_edit = FALSE +CONFIG_DEF(keyed_flag_list/roundstart_races) //races you can play as from the get go. CONFIG_DEF(flag/join_with_mutant_humans) //players can pick mutant bodyparts for humans before joining the game @@ -188,7 +166,7 @@ CONFIG_DEF(number/run_delay) //Used for modifying movement speed for mobs. CONFIG_DEF(number/walk_delay) - + CONFIG_DEF(number/human_delay) //Mob specific modifiers. NOTE: These will affect different mob types in different ways CONFIG_DEF(number/robot_delay) CONFIG_DEF(number/monkey_delay) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 689ff83935..ccfc041b21 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -362,9 +362,17 @@ SUBSYSTEM_DEF(garbage) testing("Beginning search for references to a [type].") last_find_references = world.time - DoSearchVar(GLOB) - for(var/datum/thing in world) - DoSearchVar(thing, "WorldRef: [thing]") + + DoSearchVar(GLOB) //globals + for(var/datum/thing in world) //atoms (don't beleive it's lies) + DoSearchVar(thing, "World -> [thing]") + + for (var/datum/thing) //datums + DoSearchVar(thing, "World -> [thing]") + + for (var/client/thing) //clients + DoSearchVar(thing, "World -> [thing]") + testing("Completed search for references to a [type].") if(usr && usr.client) usr.client.running_find_references = null @@ -384,35 +392,44 @@ SUBSYSTEM_DEF(garbage) if(!running_find_references) find_references(TRUE) -/datum/proc/DoSearchVar(X, Xname) +/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64) if(usr && usr.client && !usr.client.running_find_references) return + if (!recursive_limit) + return + if(istype(X, /datum)) var/datum/D = X if(D.last_find_references == last_find_references) return + D.last_find_references = last_find_references - for(var/V in D.vars) - for(var/varname in D.vars) - var/variable = D.vars[varname] - if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") - else if(islist(variable)) - if(src in variable) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]") -#ifdef GC_FAILURE_HARD_LOOKUP - for(var/I in variable) - DoSearchVar(I, TRUE) - else - DoSearchVar(variable, "[Xname]: [varname]") -#endif + var/list/L = D.vars + + for(var/varname in L) + if (varname == "vars") + continue + var/variable = L[varname] + + if(variable == src) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + + else if(islist(variable)) + DoSearchVar(variable, "[Xname] -> list", recursive_limit-1) + else if(islist(X)) - if(src in X) - testing("Found [src.type] \ref[src] in list [Xname].") -#ifdef GC_FAILURE_HARD_LOOKUP + var/normal = IS_NORMAL_LIST(X) for(var/I in X) - DoSearchVar(I, Xname + ": list") -#else + if (I == src) + testing("Found [src.type] \ref[src] in list [Xname].") + + else if (I && !isnum(I) && normal && X[I] == src) + testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") + + else if (islist(I)) + DoSearchVar(I, "[Xname] -> list", recursive_limit-1) + +#ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index fa6ca7e26b..5645f0527f 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -18,6 +18,7 @@ SUBSYSTEM_DEF(job) SetupOccupations() if(CONFIG_GET(flag/load_jobs_from_txt)) LoadJobs() + generate_selectable_species() ..() diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm index 327d20732d..1dbe564169 100644 --- a/code/controllers/subsystem/radiation.dm +++ b/code/controllers/subsystem/radiation.dm @@ -1,4 +1,41 @@ PROCESSING_SUBSYSTEM_DEF(radiation) name = "Radiation" flags = SS_NO_INIT | SS_BACKGROUND - priority = 25 \ No newline at end of file + priority = 25 + + var/list/warned_atoms = list() + var/list/next_warn = list() + var/last_warn = 0 + +/datum/controller/subsystem/processing/radiation/proc/warn(datum/component/radioactive) + if(!radioactive || QDELETED(radioactive)) + return + if(warned_atoms["\ref[radioactive.parent]"]) + return + var/atom/master = radioactive.parent + SSblackbox.add_details("contaminated", "[master.type]") + next_warn["\ref[master]"] = "\ref[radioactive]" + var/wait_time = max(0, 500-(world.time-last_warn))+20 // wait at least 20 ticks, longer if we just messaged + addtimer(CALLBACK(src, .proc/send_warn), wait_time, TIMER_UNIQUE | TIMER_OVERRIDE) + +/datum/controller/subsystem/processing/radiation/proc/send_warn() + var/msg = "Atom(s) have become contaminated by radiation and are strong enough they could pass it on:" + var/still_alive = FALSE + var/list/next_warn = src.next_warn // It's free performance! + for(var/i in next_warn) + var/atom/parent = locate(i) + var/datum/component/radioactive/radioactive = locate(next_warn[i]) + if(!parent || !istype(parent) || !radioactive || !istype(radioactive)) + continue + if(!still_alive) + msg += "\n" + still_alive = TRUE + else + msg += ", " + msg += "[parent][ADMIN_VV(parent)]source:[radioactive.source]" + if(!still_alive) + return + warned_atoms += next_warn + src.next_warn = list() + last_warn = world.time + message_admins(msg) \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 4b198d1e80..e1828b737a 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(ticker) var/force_ending = 0 //Round was ended by admin intervention // If true, there is no lobby phase, the game starts immediately. var/start_immediately = FALSE - var/setup_done = FALSE //All game setup done including mode post setup and + var/setup_done = FALSE //All game setup done including mode post setup and var/hide_mode = 0 var/datum/game_mode/mode = null @@ -127,7 +127,7 @@ SUBSYSTEM_DEF(ticker) login_music = pick(music) else login_music = "config/title_music/sounds/[pick(music)]" - + crewobjlist = typesof(/datum/objective/crew) miscreantobjlist = (typesof(/datum/objective/miscreant) - /datum/objective/miscreant) @@ -141,6 +141,7 @@ SUBSYSTEM_DEF(ticker) GLOB.syndicate_code_phrase = generate_code_phrase() if(!GLOB.syndicate_code_response) GLOB.syndicate_code_response = generate_code_phrase() + ..() start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 2f70713c32..9978b01955 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -220,3 +220,14 @@ C.OnTransfer(src) C.parent = src SendSignal(COMSIG_COMPONENT_ADDED, C) + +/datum/proc/TransferComponents(datum/target) + var/list/dc = datum_components + if(!dc) + return + var/comps = dc[/datum/component] + if(islist(comps)) + for(var/I in comps) + target.TakeComponent(I) + else + target.TakeComponent(comps) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 1661056e8c..b0bf28f163 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -27,6 +27,9 @@ CRASH("Something that wasn't an atom was given /datum/component/radioactive") return + if(strength > RAD_MINIMUM_CONTAMINATION) + SSradiation.warn(src) + START_PROCESSING(SSradiation, src) /datum/component/radioactive/Destroy() @@ -34,9 +37,8 @@ return ..() /datum/component/radioactive/process() - radiation_pulse(parent,strength,1,FALSE,can_contaminate) - if(hl3_release_date && prob(50)) + radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*2, FALSE, can_contaminate) strength -= strength / hl3_release_date if(strength <= RAD_BACKGROUND_RADIATION) qdel(src) @@ -48,7 +50,6 @@ return var/datum/component/radioactive/other = C strength = max(strength, other.strength) - return /datum/component/radioactive/proc/rad_examine(mob/user, atom/thing) var/atom/master = parent @@ -69,6 +70,7 @@ /datum/component/radioactive/proc/rad_attack(atom/movable/target, mob/living/user) radiation_pulse(parent, strength/20) target.rad_act(strength/2) + strength -= strength / hl3_release_date #undef RAD_AMOUNT_LOW #undef RAD_AMOUNT_MEDIUM diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 5ed8dcf733..5f9cf3ad9a 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -224,8 +224,7 @@ G.fields["name"] = H.real_name G.fields["rank"] = assignment G.fields["age"] = H.age - if(CONFIG_GET(flag/join_with_mutant_race)) - G.fields["species"] = H.dna.species.name + G.fields["species"] = H.dna.species.name G.fields["fingerprint"] = md5(H.dna.uni_identity) G.fields["p_stat"] = "Active" G.fields["m_stat"] = "Stable" diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index c2afb34a9e..cc388f0b59 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -49,7 +49,7 @@ Bonus to_chat(M, "[pick("You hear a ringing in your ear.", "Your ears pop.")]") if(5) if(power > 2) - var/obj/item/organ/ears/ears = M.getorganslot("ears") + var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && ears.ear_damage < UNHEALING_EAR_DAMAGE) to_chat(M, "Your ears pop painfully and start bleeding!") ears.ear_damage = max(ears.ear_damage, UNHEALING_EAR_DAMAGE) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 84f9ef49cc..728dfa01d0 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -44,7 +44,7 @@ Bonus if(!..()) return var/mob/living/carbon/M = A.affected_mob - var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if(istype(eyes)) switch(A.stage) if(1, 2) @@ -106,7 +106,7 @@ Bonus if(!..()) return var/mob/living/M = A.affected_mob - var/obj/item/organ/eyes/eyes = M.getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return switch(A.stage) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 12555ee038..3987b49750 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -263,7 +263,7 @@ /mob/living/carbon/proc/create_dna() dna = new /datum/dna(src) if(!dna.species) - var/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races)) + var/rando_race = pick(GLOB.roundstart_races) dna.species = new rando_race() //proc used to update the mob's appearance after its dna UI has been changed diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm new file mode 100644 index 0000000000..2eb897bc13 --- /dev/null +++ b/code/datums/looping_sounds/item_sounds.dm @@ -0,0 +1,37 @@ +#define RAD_GEIGER_LOW 100 // Geiger counter sound thresholds +#define RAD_GEIGER_MEDIUM 500 +#define RAD_GEIGER_HIGH 1000 + +/datum/looping_sound/geiger + mid_sounds = list( + list('sound/items/geiger/low1.ogg'=1, 'sound/items/geiger/low2.ogg'=1, 'sound/items/geiger/low3.ogg'=1, 'sound/items/geiger/low4.ogg'=1), + list('sound/items/geiger/med1.ogg'=1, 'sound/items/geiger/med2.ogg'=1, 'sound/items/geiger/med3.ogg'=1, 'sound/items/geiger/med4.ogg'=1), + list('sound/items/geiger/high1.ogg'=1, 'sound/items/geiger/high2.ogg'=1, 'sound/items/geiger/high3.ogg'=1, 'sound/items/geiger/high4.ogg'=1), + list('sound/items/geiger/ext1.ogg'=1, 'sound/items/geiger/ext2.ogg'=1, 'sound/items/geiger/ext3.ogg'=1, 'sound/items/geiger/ext4.ogg'=1) + ) + mid_length = 2 + volume = 25 + var/last_radiation + +/datum/looping_sound/geiger/get_sound(looped) + var/danger + switch(last_radiation) + if(RAD_BACKGROUND_RADIATION to RAD_GEIGER_LOW) + danger = 1 + if(RAD_GEIGER_LOW to RAD_GEIGER_MEDIUM) + danger = 2 + if(RAD_GEIGER_MEDIUM to RAD_GEIGER_HIGH) + danger = 3 + if(RAD_GEIGER_HIGH to INFINITY) + danger = 4 + else + return null + return ..(looped, mid_sounds[danger]) + +/datum/looping_sound/geiger/stop() + . = ..() + last_radiation = 0 + +#undef RAD_GEIGER_LOW +#undef RAD_GEIGER_MEDIUM +#undef RAD_GEIGER_HIGH \ No newline at end of file diff --git a/code/datums/looping_sounds/looping_sound.dm b/code/datums/looping_sounds/looping_sound.dm index 2374da67b4..aed7c3ace8 100644 --- a/code/datums/looping_sounds/looping_sound.dm +++ b/code/datums/looping_sounds/looping_sound.dm @@ -1,5 +1,5 @@ /* - list/atom/output_atoms + output_atoms (list of atoms) The destination(s) for the sounds mid_sounds (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end. mid_length (num) The length to wait between playing mid_sounds @@ -13,6 +13,7 @@ volume (num) Sound output volume muted (bool) Private. Used to stop the sound loop. max_loops (num) The max amount of loops to run for. + direct (bool) If true plays directly to provided atoms instead of from them */ /datum/looping_sound var/list/atom/output_atoms @@ -22,19 +23,18 @@ var/start_length var/end_sound var/chance - var/volume + var/volume = 100 var/muted = TRUE var/max_loops + var/direct -/datum/looping_sound/New(list/_output_atoms, start_immediately=FALSE) +/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE) if(!mid_sounds) WARNING("A looping sound datum was created without sounds to play.") return - if(_output_atoms) - output_atoms = _output_atoms - else - output_atoms = list() + output_atoms = _output_atoms + direct = _direct if(start_immediately) start() @@ -44,13 +44,17 @@ output_atoms = null return ..() -/datum/looping_sound/proc/start() +/datum/looping_sound/proc/start(atom/add_thing) + if(add_thing) + output_atoms |= add_thing if(!muted) return muted = FALSE on_start() -/datum/looping_sound/proc/stop() +/datum/looping_sound/proc/stop(atom/remove_thing) + if(remove_thing) + output_atoms -= remove_thing if(muted) return muted = TRUE @@ -65,9 +69,16 @@ /datum/looping_sound/proc/play(soundfile) var/list/atoms_cache = output_atoms + var/sound/S = sound(soundfile) + if(direct) + S.channel = open_sound_channel() + S.volume = volume for(var/i in 1 to atoms_cache.len) var/atom/thing = atoms_cache[i] - playsound(thing, soundfile, volume) + if(direct) + SEND_SOUND(thing, S) + else + playsound(thing, S, volume) /datum/looping_sound/proc/get_sound(looped, _mid_sounds) if(!_mid_sounds) diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 5a02997b00..ffc6b75fcb 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -89,18 +89,24 @@ continue thing.rad_act(strength) - var/static/list/blacklisted = typecacheof(list( //These types will never be contaminated + // This list should only be for types which don't get contaminated but you want to look in their contents + // If you don't want to look in their contents and you don't want to rad_act them: + // modify the ignored_things list in __HELPERS/radiation.dm instead + var/static/list/blacklisted = typecacheof(list( /turf, /mob, /obj/structure/cable, - /obj/machinery/atmospherics + /obj/machinery/atmospherics, + /obj/item/ammo_casing, + /obj/item/implant )) if(!can_contaminate || blacklisted[thing.type]) continue - if(prob((strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*range_modifier), 1))) // Only stronk rads get to have little baby rads + var/contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1, 1/(steps*range_modifier)) + if(prob(contamination_chance)) // Only stronk rads get to have little baby rads var/datum/component/rad_insulation/insulation = thing.GetComponent(/datum/component/rad_insulation) if(insulation && insulation.contamination_proof) continue else - var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT * min(1/(steps*range_modifier), 1) + var/rad_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT thing.AddComponent(/datum/component/radioactive, rad_strength, source) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 59ed4ab2e8..76a37f9bb1 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -75,7 +75,7 @@ var/datum/changelingprofile/prof = mind.changeling.add_new_profile(C, src) mind.changeling.first_prof = prof - var/obj/item/organ/brain/B = C.getorganslot("brain") + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) if(B) B.vital = FALSE B.decoy_override = TRUE diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index b2ddd022a4..f48464700f 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -10,7 +10,7 @@ active = FALSE /obj/effect/proc_holder/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. - var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if (E) E.flash_protect = 2 //Adjust the user's eyes' flash protection to_chat(user, "We adjust our eyes to protect them from bright lights.") @@ -20,7 +20,7 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) if(!istype(user)) return - var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if(!active) E.sight_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes @@ -42,7 +42,7 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability - var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + var/obj/item/organ/eyes/E = user.getorganslot(ORGAN_SLOT_EYES) if(E) if (active) E.sight_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS diff --git a/code/game/gamemodes/changeling/powers/regenerate.dm b/code/game/gamemodes/changeling/powers/regenerate.dm index a74b966bd8..f2b13a5d09 100644 --- a/code/game/gamemodes/changeling/powers/regenerate.dm +++ b/code/game/gamemodes/changeling/powers/regenerate.dm @@ -27,7 +27,7 @@ C.emote("scream") C.regenerate_limbs(1) C.regenerate_organs() - if(!user.getorganslot("brain")) + if(!user.getorganslot(ORGAN_SLOT_BRAIN)) var/obj/item/organ/brain/changeling_brain/B = new() B.Insert(C) if(ishuman(user)) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 99059e7a25..73a696fb3a 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -62,7 +62,7 @@ /obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H) var/icon/photo = null var/g = (H.gender == FEMALE) ? "f" : "m" - if(!CONFIG_GET(flag/join_with_mutant_race) || H.dna.species.use_skintones) + if(H.dna.species.use_skintones) photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.skin_tone]_[g]") else photo = icon("icon" = 'icons/mob/human.dmi', "icon_state" = "[H.dna.species.id]_[g]") diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index f26b60202e..6ac7e1249d 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -17,7 +17,7 @@ else if (detectTime == -1) for (var/targetref in getTargetList()) var/mob/target = locate(targetref) in GLOB.mob_list - if (target.stat == DEAD || QDELETED(target) || (!area_motion && !in_range(src, target))) + if (QDELETED(target) || target.stat == DEAD || (!area_motion && !in_range(src, target))) //If not part of a monitored area and the camera is not in range or the target is dead lostTarget(target) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 86e69b8973..cb5ea9df76 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -163,7 +163,7 @@ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) if(clonemind.changeling) - var/obj/item/organ/brain/B = H.getorganslot("brain") + var/obj/item/organ/brain/B = H.getorganslot(ORGAN_SLOT_BRAIN) B.vital = FALSE B.decoy_override = TRUE diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 31126a6c08..ee316b3eed 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -470,7 +470,7 @@ // species datums R.fields["mrace"] = dna.species else - var/datum/species/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races)) + var/datum/species/rando_race = pick(GLOB.roundstart_races) R.fields["mrace"] = rando_race.type R.fields["ckey"] = mob_occupant.ckey diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index f13cfe8c00..41b41e536e 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -123,8 +123,7 @@ dat += "
- Step one: PANIC!
- Step two: Get your ass over to engineering! QUICKLY!!!
- Step three: Make sure the SMES is still powering the emitters, if not, setup the generator in secure storage and disconnect the emitters from the SMES.
- Step four: Next, head over to the APC and swipe it with your ID card - if it doesn't unlock, continue with step 15.
- Step five: Open the console and disengage the cover lock.
- Step six: Pry open the APC with a Crowbar.
- Step seven: Take out the empty power cell.
- Step eight: Put in the new, full power cell - if you don't have one, continue with step 15.
- Step nine: Quickly put on a Radiation suit.
- Step ten: Check if the singularity field generators withstood the down-time - if they didn't, continue with step 15.
- Step eleven: Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering apc is wired to the same powernet, which the powersink is on, you have to remove the piece of wire which links the apc to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
- Step twelve: Grab your crowbar and pry away the tile closest to the APC.
- Step thirteen: Use the wirecutters to cut the wire which is conecting the grid to the terminal.
- Step fourteen: Go to the bar and tell the guys how you saved them all. Stop reading this guide here.
- Step fifteen: GET THE FUCK OUT OF THERE!!!
-
-
- It really is that easy! Good luck! - - - - "} - -/obj/item/book/manual/medical_cloning - name = "Cloning techniques of the 26th century" - icon_state ="bookCloning" - author = "Medical Journal, volume 3" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned - title = "Cloning techniques of the 26th century" -//big pile of shit below. - - dat = {" -
- - - - -If you’ve gotten this far, congratulations! You have mastered the art of cloning. Now, the real problem is how to resurrect yourself after that traitor had his way with you for cloning his target. - - - - - - "} - - -/obj/item/book/manual/ripley_build_and_repair - name = "APLU \"Ripley\" Construction and Operation Manual" - icon_state ="book" - author = "Weyland-Yutani Corp" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned - title = "APLU \"Ripley\" Construction and Operation Manual" -//big pile of shit below. - - dat = {" -
- - - --
- It really is that easy! Good luck!
-
-
- "}
-
-/obj/item/book/manual/nuclear
- name = "Fission Mailed: Nuclear Sabotage 101"
- icon_state ="bookNuclear"
- author = "Syndicate"
- title = "Fission Mailed: Nuclear Sabotage 101"
- dat = {"
- Nuclear Explosives 101:
- Hello and thank you for choosing the Syndicate for your nuclear information needs.
- Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.
- First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.
- Pressing any button on the compacted bomb will cause it to extend and bolt itself into place.
- If this is done to unbolt it one must completely log in which at this time may not be possible.
- To make the nuclear device functional:
-
You start skimming through the manual...
- - - - - - "} - -/obj/item/book/manual/wiki/chemistry - name = "Chemistry Textbook" - icon_state ="chemistrybook" - author = "Nanotrasen" - title = "Chemistry Textbook" - page_link = "Guide_to_chemistry" - -/obj/item/book/manual/wiki/engineering_construction - name = "Station Repairs and Construction" - icon_state ="bookEngineering" - author = "Engineering Encyclopedia" - title = "Station Repairs and Construction" - page_link = "Guide_to_construction" - -/obj/item/book/manual/wiki/engineering_guide - name = "Engineering Textbook" - icon_state ="bookEngineering2" - author = "Engineering Encyclopedia" - title = "Engineering Textbook" - page_link = "Guide_to_engineering" - -/obj/item/book/manual/wiki/security_space_law - name = "Space Law" - desc = "A set of Nanotrasen guidelines for keeping law and order on their space stations." - icon_state = "bookSpaceLaw" - author = "Nanotrasen" - title = "Space Law" - page_link = "Space_Law" - -/obj/item/book/manual/wiki/infections - name = "Infections - Making your own pandemic!" - icon_state = "bookInfections" - author = "Infections Encyclopedia" - title = "Infections - Making your own pandemic!" - page_link = "Infections" - -/obj/item/book/manual/wiki/telescience - name = "Teleportation Science - Bluespace for dummies!" - icon_state = "book7" - author = "University of Bluespace" - title = "Teleportation Science - Bluespace for dummies!" - page_link = "Guide_to_telescience" - -/obj/item/book/manual/wiki/engineering_hacking - name = "Hacking" - icon_state ="bookHacking" - author = "Engineering Encyclopedia" - title = "Hacking" - page_link = "Hacking" +/*********************MANUALS (BOOKS)***********************/ + +//Oh god what the fuck I am not good at computer +/obj/item/book/manual + icon = 'icons/obj/library.dmi' + due_date = 0 // Game time in 1/10th seconds + unique = 1 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified + +/obj/item/book/manual/engineering_particle_accelerator + name = "Particle Accelerator User's Guide" + icon_state ="bookParticleAccelerator" + author = "Engineering Encyclopedia" // Whoever wrote the paper or book, can be changed by pen or PC. It is not automatically assigned. + title = "Particle Accelerator User's Guide" +//book contents below + + dat = {" + + + + + +
+ Step one: PANIC!
+ Step two: Get your ass over to engineering! QUICKLY!!!
+ Step three: Make sure the SMES is still powering the emitters, if not, setup the generator in secure storage and disconnect the emitters from the SMES.
+ Step four: Next, head over to the APC and swipe it with your ID card - if it doesn't unlock, continue with step 15.
+ Step five: Open the console and disengage the cover lock.
+ Step six: Pry open the APC with a Crowbar.
+ Step seven: Take out the empty power cell.
+ Step eight: Put in the new, full power cell - if you don't have one, continue with step 15.
+ Step nine: Quickly put on a Radiation suit.
+ Step ten: Check if the singularity field generators withstood the down-time - if they didn't, continue with step 15.
+ Step eleven: Since disaster was averted you now have to ensure it doesn't repeat. If it was a powersink which caused it and if the engineering apc is wired to the same powernet, which the powersink is on, you have to remove the piece of wire which links the apc to the powernet. If it wasn't a powersink which caused it, then skip to step 14.
+ Step twelve: Grab your crowbar and pry away the tile closest to the APC.
+ Step thirteen: Use the wirecutters to cut the wire which is conecting the grid to the terminal.
+ Step fourteen: Go to the bar and tell the guys how you saved them all. Stop reading this guide here.
+ Step fifteen: GET THE FUCK OUT OF THERE!!!
+
+
+ It really is that easy! Good luck! + + + + "} + +/obj/item/book/manual/medical_cloning + name = "Cloning techniques of the 26th century" + icon_state ="bookCloning" + author = "Medical Journal, volume 3" + title = "Cloning techniques of the 26th century" + dat = {" +
+ + + + +If you've gotten this far, congratulations! You have mastered the art of cloning. Now, the real problem is how to resurrect yourself after that traitor had his way with you for cloning his target. + + + + + + "} + + +/obj/item/book/manual/ripley_build_and_repair + name = "APLU \"Ripley\" Construction and Operation Manual" + icon_state ="book" + author = "Weyland-Yutani Corp" + title = "APLU \"Ripley\" Construction and Operation Manual" + dat = {" +
+ + + ++
+ It really is that easy! Good luck!
+
+
+ "}
+
+/obj/item/book/manual/nuclear
+ name = "Fission Mailed: Nuclear Sabotage 101"
+ icon_state ="bookNuclear"
+ author = "Syndicate"
+ title = "Fission Mailed: Nuclear Sabotage 101"
+ dat = {"
+ Nuclear Explosives 101:
+ Hello and thank you for choosing the Syndicate for your nuclear information needs.
+ Today's crash course will deal with the operation of a Fusion Class Nanotrasen made Nuclear Device.
+ First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE.
+ Pressing any button on the compacted bomb will cause it to extend and bolt itself into place.
+ If this is done to unbolt it one must completely log in which at this time may not be possible.
+ To make the nuclear device functional:
+
You start skimming through the manual...
+ + + + + + "} + +/obj/item/book/manual/wiki/chemistry + name = "Chemistry Textbook" + icon_state ="chemistrybook" + author = "Nanotrasen" + title = "Chemistry Textbook" + page_link = "Guide_to_chemistry" + +/obj/item/book/manual/wiki/engineering_construction + name = "Station Repairs and Construction" + icon_state ="bookEngineering" + author = "Engineering Encyclopedia" + title = "Station Repairs and Construction" + page_link = "Guide_to_construction" + +/obj/item/book/manual/wiki/engineering_guide + name = "Engineering Textbook" + icon_state ="bookEngineering2" + author = "Engineering Encyclopedia" + title = "Engineering Textbook" + page_link = "Guide_to_engineering" + +/obj/item/book/manual/wiki/security_space_law + name = "Space Law" + desc = "A set of Nanotrasen guidelines for keeping law and order on their space stations." + icon_state = "bookSpaceLaw" + author = "Nanotrasen" + title = "Space Law" + page_link = "Space_Law" + +/obj/item/book/manual/wiki/infections + name = "Infections - Making your own pandemic!" + icon_state = "bookInfections" + author = "Infections Encyclopedia" + title = "Infections - Making your own pandemic!" + page_link = "Infections" + +/obj/item/book/manual/wiki/telescience + name = "Teleportation Science - Bluespace for dummies!" + icon_state = "book7" + author = "University of Bluespace" + title = "Teleportation Science - Bluespace for dummies!" + page_link = "Guide_to_telescience" + +/obj/item/book/manual/wiki/engineering_hacking + name = "Hacking" + icon_state ="bookHacking" + author = "Engineering Encyclopedia" + title = "Hacking" + page_link = "Hacking" diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 8f5d43d51e..513bdd2474 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -31,7 +31,7 @@ H.internal = null H.update_internals_hud_icon(0) else - if(!H.getorganslot("breathing_tube")) + if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) if(!H.wear_mask) to_chat(H, "You need a mask!") return diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 296e4ba757..711f9baf0b 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -101,8 +101,7 @@ ..() /obj/structure/mirror/magic/lesser/New() - var/list/L = CONFIG_GET(keyed_flag_list/roundstart_races) - choosable_races = L.Copy() + choosable_races = GLOB.roundstart_races.Copy() ..() /obj/structure/mirror/magic/badmin/New() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 3889872275..0135bfbfa0 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -237,6 +237,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) . += " (IC)" . += " (CLOSE)" . += " (RSLVE)" + . += " (HANDLE)" //private /datum/admin_help/proc/LinkedReplyName(ref_src) @@ -382,6 +383,22 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("Marked as IC issue by [key_name]") Resolve(silent = TRUE) +//Let the initiator know their ahelp is being handled +/datum/admin_help/proc/HandleIssue(key_name = key_name_admin(usr)) + if(state != AHELP_ACTIVE) + return + + var/msg = "Your ticket is now being handled by an admin. Please be patient." + + if(initiator) + to_chat(initiator, msg) + + SSblackbox.inc("ahelp_handleissue") + msg = "Ticket [TicketHref("#[id]")] is being handled by [key_name]" + message_admins(msg) + log_admin_private(msg) + AddInteraction("Being handled by [key_name]") + //Show the ticket panel /datum/admin_help/proc/TicketPanel() var/list/dat = list("| "
- if(CONFIG_GET(flag/join_with_mutant_race))
- dat += "Species: [pref_species.name] " - else - dat += "Species: Human " + dat += "Species: [pref_species.name] " dat += "Underwear: [underwear] " dat += "Undershirt: [undershirt] " @@ -337,79 +334,79 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " | "
- if(CONFIG_GET(flag/join_with_mutant_race)) //We don't allow mutant bodyparts for humans either unless this is true.
- if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
+ if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
- dat += "" + dat += " | "
- dat += "Mutant Color" + dat += "Mutant Color" - dat += " Change" + dat += " Change " - dat += " | "
+ dat += ""
- if("tail_lizard" in pref_species.mutant_bodyparts)
- dat += "" + if("tail_lizard" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Tail" + dat += "Tail" - dat += "[features["tail_lizard"]]" + dat += "[features["tail_lizard"]] " - dat += " | "
+ dat += ""
- if("snout" in pref_species.mutant_bodyparts)
- dat += "" + if("snout" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Snout" + dat += "Snout" - dat += "[features["snout"]]" + dat += "[features["snout"]] " - dat += " | "
+ dat += ""
- if("horns" in pref_species.mutant_bodyparts)
- dat += "" + if("horns" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Horns" + dat += "Horns" - dat += "[features["horns"]]" + dat += "[features["horns"]] " - dat += " | "
+ dat += ""
- if("frills" in pref_species.mutant_bodyparts)
- dat += "" + if("frills" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Frills" + dat += "Frills" - dat += "[features["frills"]]" + dat += "[features["frills"]] " - dat += " | "
+ dat += ""
- if("spines" in pref_species.mutant_bodyparts)
- dat += "" + if("spines" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Spines" + dat += "Spines" - dat += "[features["spines"]]" + dat += "[features["spines"]] " - dat += " | "
+ dat += ""
- if("body_markings" in pref_species.mutant_bodyparts)
- dat += "" + if("body_markings" in pref_species.mutant_bodyparts) + dat += " | "
- dat += "Body Markings" + dat += "Body Markings" - dat += "[features["body_markings"]]" + dat += "[features["body_markings"]] " - dat += " | "
- if("legs" in pref_species.mutant_bodyparts)
- dat += "" + dat += " | " + if("legs" in pref_species.mutant_bodyparts) + dat += ""
- dat += "Legs" + dat += "Legs" - dat += "[features["legs"]]" + dat += "[features["legs"]] " + + dat += " | "
- dat += ""
if(CONFIG_GET(flag/join_with_mutant_humans))
if("tail_human" in pref_species.mutant_bodyparts)
@@ -574,61 +571,60 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[features["flavor_text"]]"
else
dat += "[TextPreview(features["flavor_text"])]..." @@ -1188,7 +1184,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("species") - var/result = input(user, "Select a species", "Species Selection") as null|anything in CONFIG_GET(keyed_flag_list/roundstart_races) + var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races if(result) var/newtype = GLOB.species_list[result] @@ -1826,10 +1822,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.features = features.Copy() //Flavor text is now a DNA feature character.dna.real_name = character.real_name var/datum/species/chosen_species - if(pref_species != /datum/species/human && CONFIG_GET(flag/join_with_mutant_race)) + if(pref_species.id in GLOB.roundstart_races) chosen_species = pref_species.type else chosen_species = /datum/species/human + pref_species = new /datum/species/human + save_character() character.set_species(chosen_species, icon_update=0) //citadel code diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index dddac1e506..48dab29cf6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -294,14 +294,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Species var/species_id S["species"] >> species_id - var/list/roundstart_races = CONFIG_GET(keyed_flag_list/roundstart_races) - if(species_id && (species_id in roundstart_races) && CONFIG_GET(flag/join_with_mutant_race)) + if(species_id) var/newtype = GLOB.species_list[species_id] pref_species = new newtype() - else if (roundstart_races.len) - var/rando_race = pick(roundstart_races) - if (rando_race) - pref_species = new rando_race() if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") WRITE_FILE(S["features["mcolor"]"] , "#FFF") diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 74e2f70c37..2b66a85fe6 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -59,8 +59,8 @@ var/heart_strength = "no" var/lung_strength = "no" - var/obj/item/organ/heart/heart = M.getorganslot("heart") - var/obj/item/organ/lungs/lungs = M.getorganslot("lungs") + var/obj/item/organ/heart/heart = M.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/lungs/lungs = M.getorganslot(ORGAN_SLOT_LUNGS) if(!(M.stat == DEAD || (M.status_flags&FAKEDEATH))) if(heart && istype(heart)) @@ -179,4 +179,4 @@ desc = "Damn, it feels good to be a gangster." icon = 'icons/obj/clothing/neck.dmi' icon_state = "bling" - item_color = "bling" + item_color = "bling" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index a604eae015..75a63352e2 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -13,6 +13,20 @@ item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite) actions_types = list(/datum/action/item_action/toggle_helmet_light) + var/rad_count = 0 + var/rad_record = 0 + var/grace_count = 0 + var/datum/looping_sound/geiger/soundloop + +/obj/item/clothing/head/helmet/space/hardsuit/Initialize() + . = ..() + soundloop = new(list(), FALSE, TRUE) + soundloop.volume = 5 + START_PROCESSING(SSobj, src) + +/obj/item/clothing/head/helmet/space/hardsuit/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) /obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) on = !on @@ -31,6 +45,7 @@ ..() if(suit) suit.RemoveHelmet() + soundloop.stop(user) /obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot) if(slot == slot_head) @@ -41,8 +56,11 @@ if(slot != slot_head) if(suit) suit.RemoveHelmet() + soundloop.stop(user) else qdel(src) + else + soundloop.start(user) /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc @@ -50,9 +68,22 @@ wearer.show_message("[icon2html(src, wearer)][msg]", 1) /obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) - ..() - if(severity > RAD_AMOUNT_EXTREME) - display_visor_message("Radiation pulse detected! Magnitude: [severity] RADs.") + . = ..() + rad_count += severity + +/obj/item/clothing/head/helmet/space/hardsuit/process() + if(!rad_count) + grace_count++ + if(grace_count == 2) + soundloop.last_radiation = 0 + return + + grace_count = 0 + rad_record -= rad_record/5 + rad_record += rad_count/5 + rad_count = 0 + + soundloop.last_radiation = rad_record /obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity) ..() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 38fbe299f5..c70c4f341c 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -112,8 +112,9 @@ item_state = "bombsuit_white" /* - * Radiation protection - */ +* Radiation protection +*/ + /obj/item/clothing/head/radiation name = "radiation hood" icon_state = "rad" diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 5415eab386..f83024bd3d 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -10,12 +10,8 @@ ..() for(var/mob/living/carbon/human/H in GLOB.mob_list) var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/storage/spooky(b) - if(ishuman(H) || islizard(H)) - if(prob(50)) - H.set_species(/datum/species/skeleton) - else - H.set_species(/datum/species/zombie) + if(b) + new /obj/item/storage/spooky(b) for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_list) Ian.place_on_head(new /obj/item/bedsheet(Ian)) @@ -26,77 +22,6 @@ /datum/round_event/spooky/announce() priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") -//Eyeball migration -/datum/round_event_control/carp_migration/eyeballs - name = "Eyeball Migration" - typepath = /datum/round_event/carp_migration/eyeballs - holidayID = HALLOWEEN - weight = 25 - earliest_start = 0 - -/datum/round_event/carp_migration/eyeballs/start() - for(var/obj/effect/landmark/carpspawn/C in GLOB.landmarks_list) - new /mob/living/simple_animal/hostile/carp/eyeball(C.loc) - -//Pumpking meteors waves -/datum/round_event_control/meteor_wave/spooky - name = "Pumpkin Wave" - typepath = /datum/round_event/meteor_wave/spooky - holidayID = HALLOWEEN - weight = 20 - max_occurrences = 2 - -/datum/round_event/meteor_wave/spooky - endWhen = 40 - -/datum/round_event/meteor_wave/spooky/tick() - if(IsMultiple(activeFor, 4)) - spawn_meteors(3, GLOB.meteorsSPOOKY) //meteor list types defined in gamemode/meteor/meteors.dm - -//Creepy clown invasion -/datum/round_event_control/creepy_clowns - name = "Clowns" - typepath = /datum/round_event/creepy_clowns - holidayID = HALLOWEEN - weight = 20 - earliest_start = 0 - -/datum/round_event/creepy_clowns - endWhen = 40 - -/datum/round_event/creepy_clowns/start() - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - if(!H.client || !istype(H)) - return - to_chat(H, "Honk...") - SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg')) - var/turf/T = get_turf(H) - if(T) - new /obj/effect/hallucination/simple/clown(T, H, 50) - -/datum/round_event/creepy_clowns/tick() - if(IsMultiple(activeFor, 4)) - for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - if (prob(66)) - playsound(H.loc, pick('sound/spookoween/scary_horn.ogg','sound/spookoween/scary_horn2.ogg', 'sound/spookoween/scary_horn3.ogg'), 100, 1) - if (prob(33)) - var/turf/T = get_turf(H) - if(T) - new /obj/effect/hallucination/simple/clown(T, H, 25) - else if (prob(25)) - var/turf/T = get_turf(H) - if(T) - new /obj/effect/hallucination/simple/clown/scary(T, H, 25) - else if (prob(5)) - var/turf/T = get_turf(H) - if(T) - spawn_atom_to_turf(/obj/effect/mob_spawn/human/clown/corpse, H, 1) - else if (prob(1)) - spawn_atom_to_turf(/mob/living/simple_animal/hostile/retaliate/clown, H, 1) - -/datum/round_event/creepy_clowns/announce() - priority_announce("Honk... Honk... honk... HONK! HONK! HONKHONKHONKHONKHONK", "HONK!", 'sound/spookoween/scary_horn.ogg') - //spooky foods (you can't actually make these when it's not halloween) /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull name = "skull cookie" @@ -110,7 +35,6 @@ icon = 'icons/obj/halloween_items.dmi' icon_state = "coffincookie" - //spooky items /obj/item/storage/spooky diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index d46525a0eb..7940eaeec8 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -1,68 +1,72 @@ -// Normal strength - -/datum/round_event_control/meteor_wave - name = "Meteor Wave: Normal" - typepath = /datum/round_event/meteor_wave - weight = 4 - min_players = 5 - max_occurrences = 3 - -/datum/round_event/meteor_wave - startWhen = 6 - endWhen = 66 - announceWhen = 1 - var/list/wave_type - var/wave_name = "normal" - -/datum/round_event/meteor_wave/New() - ..() - if(!wave_type) - determine_wave_type() - -/datum/round_event/meteor_wave/proc/determine_wave_type() - if(!wave_name) - wave_name = pickweight(list( - "normal" = 50, - "threatening" = 40, - "catastrophic" = 10)) - switch(wave_name) - if("normal") - wave_type = GLOB.meteors_normal - if("threatening") - wave_type = GLOB.meteors_threatening - if("catastrophic") - wave_type = GLOB.meteors_catastrophic - if("meaty") - wave_type = GLOB.meteorsB - if("space dust") - wave_type = GLOB.meteorsC - else - WARNING("Wave name of [wave_name] not recognised.") - kill() - -/datum/round_event/meteor_wave/announce() - priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg') - -/datum/round_event/meteor_wave/tick() - if(IsMultiple(activeFor, 3)) - spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm - -/datum/round_event_control/meteor_wave/threatening - name = "Meteor Wave: Threatening" - typepath = /datum/round_event/meteor_wave/threatening - weight = 2 - min_players = 5 - max_occurrences = 3 - -/datum/round_event/meteor_wave/threatening - wave_name = "threatening" - -/datum/round_event_control/meteor_wave/catastrophic - name = "Meteor Wave: Catastrophic" - typepath = /datum/round_event/meteor_wave/catastrophic - weight = 1 - min_players = 5 - max_occurrences = 3 - -/datum/round_event/meteor_wave/catastrophic - wave_name = "catastrophic" +// Normal strength + +/datum/round_event_control/meteor_wave + name = "Meteor Wave: Normal" + typepath = /datum/round_event/meteor_wave + weight = 4 + min_players = 5 + max_occurrences = 3 + +/datum/round_event/meteor_wave + startWhen = 6 + endWhen = 66 + announceWhen = 1 + var/list/wave_type + var/wave_name = "normal" + +/datum/round_event/meteor_wave/New() + ..() + if(!wave_type) + determine_wave_type() + +/datum/round_event/meteor_wave/proc/determine_wave_type() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + wave_name = "halloween" + if(!wave_name) + wave_name = pickweight(list( + "normal" = 50, + "threatening" = 40, + "catastrophic" = 10)) + switch(wave_name) + if("normal") + wave_type = GLOB.meteors_normal + if("threatening") + wave_type = GLOB.meteors_threatening + if("catastrophic") + wave_type = GLOB.meteors_catastrophic + if("meaty") + wave_type = GLOB.meteorsB + if("space dust") + wave_type = GLOB.meteorsC + if("halloween") + wave_type = GLOB.meteorsSPOOKY + else + WARNING("Wave name of [wave_name] not recognised.") + kill() + +/datum/round_event/meteor_wave/announce() + priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg') + +/datum/round_event/meteor_wave/tick() + if(IsMultiple(activeFor, 3)) + spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm + +/datum/round_event_control/meteor_wave/threatening + name = "Meteor Wave: Threatening" + typepath = /datum/round_event/meteor_wave/threatening + weight = 2 + min_players = 5 + max_occurrences = 3 + +/datum/round_event/meteor_wave/threatening + wave_name = "threatening" + +/datum/round_event_control/meteor_wave/catastrophic + name = "Meteor Wave: Catastrophic" + typepath = /datum/round_event/meteor_wave/catastrophic + weight = 1 + min_players = 5 + max_occurrences = 3 + +/datum/round_event/meteor_wave/catastrophic + wave_name = "catastrophic" diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index c8e9235646..751bc53eac 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -272,7 +272,7 @@ /datum/holiday/halloween name = HALLOWEEN - begin_day = 30 + begin_day = 28 begin_month = OCTOBER end_day = 2 end_month = NOVEMBER diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 01c3e6d630..f362f09a65 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -14,7 +14,7 @@ facial_hair_color = hair_color eye_color = random_eye_color() if(!pref_species) - var/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races)) + var/rando_race = pick(GLOB.roundstart_races) pref_species = new rando_race() features = random_features() age = rand(AGE_MIN,AGE_MAX) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 30d5652ab4..45f26d55c3 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -216,25 +216,23 @@ . = list() if(!bloodtype) return - switch(bloodtype) - if("A-") - return list("A-", "O-") - if("A+") - return list("A-", "A+", "O-", "O+") - if("B-") - return list("B-", "O-") - if("B+") - return list("B-", "B+", "O-", "O+") - if("AB-") - return list("A-", "B-", "O-", "AB-") - if("AB+") - return list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+") - if("O-") - return list("O-") - if("O+") - return list("O-", "O+") - if("L") - return list("L") + + var/static/list/bloodtypes_safe = list( + "A-" = list("A-", "O-"), + "A+" = list("A-", "A+", "O-", "O+"), + "B-" = list("B-", "O-"), + "B+" = list("B-", "B+", "O-", "O+"), + "AB-" = list("A-", "B-", "O-", "AB-"), + "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"), + "O-" = list("O-"), + "O+" = list("O-", "O+"), + "L" = list("L"), + "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U") + ) + + var/safe = bloodtypes_safe[bloodtype] + if(safe) + . = safe //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 94ed0129c7..c175acf9d6 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -19,7 +19,7 @@ /mob/living/brain/proc/create_dna() stored_dna = new /datum/dna/stored(src) if(!stored_dna.species) - var/rando_race = pick(CONFIG_GET(keyed_flag_list/roundstart_races)) + var/rando_race = pick(GLOB.roundstart_races) stored_dna.species = new rando_race() /mob/living/brain/Destroy() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 6ac5ab1bad..a3642684db 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -6,7 +6,7 @@ throw_range = 5 layer = ABOVE_MOB_LAYER zone = "head" - slot = "brain" + slot = ORGAN_SLOT_BRAIN vital = TRUE origin_tech = "biotech=5" attack_verb = list("attacked", "slapped", "whacked") @@ -70,7 +70,7 @@ C.dna.copy_dna(brainmob.stored_dna) if(L.disabilities & NOCLONE) brainmob.disabilities |= NOCLONE //This is so you can't just decapitate a husked guy and clone them without needing to get a new body - var/obj/item/organ/zombie_infection/ZI = L.getorganslot("zombie_infection") + var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned if(L.mind && L.mind.current) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 218af45c6e..4174b08642 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -224,7 +224,7 @@ internal = null update_internals_hud_icon(0) else if(ITEM && istype(ITEM, /obj/item/tank)) - if((wear_mask && (wear_mask.flags_1 & MASKINTERNALS_1)) || getorganslot("breathing_tube")) + if((wear_mask && (wear_mask.flags_1 & MASKINTERNALS_1)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = ITEM update_internals_hud_icon(1) @@ -523,7 +523,7 @@ sight = initial(sight) lighting_alpha = initial(lighting_alpha) - var/obj/item/organ/eyes/E = getorganslot("eye_sight") + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) update_tint() else @@ -580,7 +580,7 @@ if(wear_mask) . += wear_mask.tint - var/obj/item/organ/eyes/E = getorganslot("eye_sight") + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(E) . += E.tint diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 66f4fc8fb2..1d6f7f6484 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -14,7 +14,7 @@ var/obj/item/clothing/mask/MFP = src.wear_mask number += MFP.flash_protect - var/obj/item/organ/eyes/E = getorganslot("eye_sight") + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) if(!E) number = INFINITY //Can't get flashed without eyes else @@ -28,7 +28,7 @@ number += 1 if(head && (head.flags_2 & BANG_PROTECT_2)) number += 1 - var/obj/item/organ/ears/E = getorganslot("ears") + var/obj/item/organ/ears/E = getorganslot(ORGAN_SLOT_EARS) if(!E) number = INFINITY else @@ -279,7 +279,7 @@ var/damage = intensity - get_eye_protection() if(.) // we've been flashed - var/obj/item/organ/eyes/eyes = getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if (!eyes) return if(visual) @@ -323,7 +323,7 @@ /mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) var/ear_safety = get_ear_protection() - var/obj/item/organ/ears/ears = getorganslot("ears") + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) @@ -363,6 +363,6 @@ /mob/living/carbon/can_hear() . = FALSE - var/obj/item/organ/ears/ears = getorganslot("ears") + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) if(istype(ears) && !ears.deaf) . = TRUE diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index aa37315b13..ed731408d8 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -39,7 +39,7 @@ return 1 // Do we have a jetpack implant (and is it on)? - var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot("thrusters") + var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot(ORGAN_SLOT_THRUSTERS) if(istype(T) && movement_dir && T.allow_thrust(0.01)) return 1 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index c3ae5c39c3..4b1afe0780 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -20,7 +20,7 @@ if(stat == DEAD) return stop_sound_channel(CHANNEL_HEARTBEAT) - var/obj/item/organ/heart/H = getorganslot("heart") + var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) if(H) H.beat = BEAT_NONE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1d7b482875..a39b84e47c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -270,13 +270,13 @@ if(ishuman(usr)) var/mob/living/carbon/human/H = usr var/perpname = get_face_name(get_id_name("")) - if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud)) var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.general) if(href_list["photo_front"] || href_list["photo_side"]) if(R) if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) return var/obj/item/photo/P = null if(href_list["photo_front"]) @@ -287,13 +287,13 @@ P.show(H) if(href_list["hud"] == "m") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) if(href_list["p_stat"]) var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") if(R) if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) return if(health_status && health_status != "Cancel") R.fields["p_stat"] = health_status @@ -303,7 +303,7 @@ if(R) if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/medical)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/health) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/medical)) return if(health_status && health_status != "Cancel") R.fields["m_stat"] = health_status @@ -352,7 +352,7 @@ to_chat(usr, "Gathered data is inconsistent with the analysis, possible cause: poisoning.") if(href_list["hud"] == "s") - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) if(usr.stat || usr == src) //|| !usr.canmove || usr.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. return //Non-fluff: This allows sec to set people to arrest as they get disarmed or beaten // Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access @@ -379,7 +379,7 @@ if(setcriminal != "Cancel") if(R) if(H.canUseHUD()) - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) investigate_log("[src.key] has been set from [R.fields["criminal"]] to [setcriminal] by [usr.name] ([usr.key]).", INVESTIGATE_RECORDS) R.fields["criminal"] = setcriminal sec_hud_set_security_status() @@ -389,7 +389,7 @@ if(R) if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]") to_chat(usr, "Minor Crimes:") @@ -418,7 +418,7 @@ return else if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) GLOB.data_core.addMinorCrime(R.fields["id"], crime) @@ -433,7 +433,7 @@ return else if (!H.canUseHUD()) return - else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + else if (!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return var/crime = GLOB.data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text()) GLOB.data_core.addMajorCrime(R.fields["id"], crime) @@ -444,7 +444,7 @@ if(R) if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return to_chat(usr, "Comments/Log:") var/counter = 1 @@ -462,7 +462,7 @@ return else if(!H.canUseHUD()) return - else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security)) + else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot(ORGAN_SLOT_HUD), /obj/item/organ/cyberimp/eyes/hud/security)) return var/counter = 1 while(R.fields[text("com_[]", counter)]) @@ -637,7 +637,7 @@ return 0 var/they_breathe = (!(NOBREATH in C.dna.species.species_traits)) - var/they_lung = C.getorganslot("lungs") + var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS) if(C.health > HEALTH_THRESHOLD_CRIT) return diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 07bcb484a0..f21f872d0a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -451,7 +451,7 @@ siemens_coeff = gloves_siemens_coeff if(undergoing_cardiac_arrest() && !illusion) if(shock_damage * siemens_coeff >= 1 && prob(25)) - var/obj/item/organ/heart/heart = getorganslot("heart") + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) heart.beating = TRUE if(stat == CONSCIOUS) to_chat(src, "You feel your heart beating again!") diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 1679ff5d42..71c5dedc26 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -225,7 +225,7 @@ /mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1) if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) update_hair() - if(toggle_off && internal && !getorganslot("breathing_tube")) + if(toggle_off && internal && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) update_internals_hud_icon(0) internal = null if(C.flags_inv & HIDEEYES) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a17dbd6f75..67843b3e64 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -93,7 +93,7 @@ #define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30) /mob/living/carbon/human/check_breath(datum/gas_mixture/breath) - var/L = getorganslot("lungs") + var/L = getorganslot(ORGAN_SLOT_LUNGS) if(!L) if(health >= HEALTH_THRESHOLD_CRIT) @@ -338,7 +338,7 @@ /mob/living/carbon/human/proc/undergoing_cardiac_arrest() if(!can_heartattack()) return FALSE - var/obj/item/organ/heart/heart = getorganslot("heart") + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(istype(heart) && heart.beating) return FALSE return TRUE @@ -347,7 +347,7 @@ if(!can_heartattack()) return FALSE - var/obj/item/organ/heart/heart = getorganslot("heart") + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(!istype(heart)) return diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index d38fa73761..1374b391ce 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -49,7 +49,7 @@ CHECK_DNA_AND_SPECIES(src) // how do species that don't breathe talk? magic, that's what. - if(!(NOBREATH in dna.species.species_traits) && !getorganslot("lungs")) + if(!(NOBREATH in dna.species.species_traits) && !getorganslot(ORGAN_SLOT_LUNGS)) return 0 if(mind) return !mind.miming diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 7a212d371b..f5b339405d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1,5 +1,7 @@ // This code handles different species in the game. +GLOBAL_LIST_EMPTY(roundstart_races) + #define HEAT_DAMAGE_LEVEL_1 2 #define HEAT_DAMAGE_LEVEL_2 3 #define HEAT_DAMAGE_LEVEL_3 8 @@ -12,7 +14,6 @@ var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans. var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever - var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?) var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows @@ -65,6 +66,7 @@ var/breathid = "o2" var/obj/item/organ/brain/mutant_brain = /obj/item/organ/brain + var/obj/item/organ/heart/mutant_heart = /obj/item/organ/heart var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes var/obj/item/organ/ears/mutantears = /obj/item/organ/ears var/obj/item/mutanthands @@ -92,6 +94,20 @@ ..() +/proc/generate_selectable_species() + for(var/I in subtypesof(/datum/species)) + var/datum/species/S = new I + if(S.check_roundstart_eligible()) + GLOB.roundstart_races += S.id + qdel(S) + if(!GLOB.roundstart_races.len) + GLOB.roundstart_races += "human" + +/datum/species/proc/check_roundstart_eligible() + if(id in (CONFIG_GET(keyed_flag_list/roundstart_races))) + return TRUE + return FALSE + /datum/species/proc/random_name(gender,unique,lastname) if(unique) return random_unique_name(gender) @@ -122,15 +138,15 @@ //Will regenerate missing organs /datum/species/proc/regenerate_organs(mob/living/carbon/C,datum/species/old_species,replace_current=TRUE) - var/obj/item/organ/brain/brain = C.getorganslot("brain") - var/obj/item/organ/heart/heart = C.getorganslot("heart") - var/obj/item/organ/lungs/lungs = C.getorganslot("lungs") - var/obj/item/organ/appendix/appendix = C.getorganslot("appendix") - var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight") - var/obj/item/organ/ears/ears = C.getorganslot("ears") - var/obj/item/organ/tongue/tongue = C.getorganslot("tongue") - var/obj/item/organ/liver/liver = C.getorganslot("liver") - var/obj/item/organ/stomach/stomach = C.getorganslot("stomach") + var/obj/item/organ/brain/brain = C.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/organ/heart/heart = C.getorganslot(ORGAN_SLOT_HEART) + var/obj/item/organ/lungs/lungs = C.getorganslot(ORGAN_SLOT_LUNGS) + var/obj/item/organ/appendix/appendix = C.getorganslot(ORGAN_SLOT_APPENDIX) + var/obj/item/organ/eyes/eyes = C.getorganslot(ORGAN_SLOT_EYES) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + var/obj/item/organ/tongue/tongue = C.getorganslot(ORGAN_SLOT_TONGUE) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/stomach/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) var/should_have_brain = TRUE var/should_have_heart = !(NOBLOOD in species_traits) @@ -154,7 +170,7 @@ heart.Remove(C,1) QDEL_NULL(heart) if(should_have_heart && !heart) - heart = new() + heart = new mutant_heart() heart.Insert(C) if(lungs && (replace_current || !should_have_lungs)) @@ -1152,7 +1168,7 @@ if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB)) H.vomit(10, TRUE) - + if(radiation > RAD_MOB_MUTATE) if(prob(1)) to_chat(H, "You mutate!") @@ -1204,7 +1220,7 @@ if(!gravity) var/obj/item/tank/jetpack/J = H.back var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit - var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot("thrusters") + var/obj/item/organ/cyberimp/chest/thrusters/T = H.getorganslot(ORGAN_SLOT_THRUSTERS) if(!istype(J) && istype(C)) J = C.jetpack if(istype(J) && J.full_speed && J.allow_thrust(0.01, H)) //Prevents stacking @@ -1260,7 +1276,7 @@ return 1 else var/we_breathe = (!(NOBREATH in user.dna.species.species_traits)) - var/we_lung = user.getorganslot("lungs") + var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS) if(we_breathe && we_lung) user.do_cpr(target) diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index d15280790e..bff4d8554a 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -8,7 +8,6 @@ attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 liked_food = MEAT | FRIED disliked_food = TOXIC @@ -31,7 +30,6 @@ attack_verb = "peck" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 liked_food = MEAT | FRUIT disliked_food = TOXIC @@ -53,7 +51,6 @@ attack_verb = "bite" attack_sound = 'sound/weapons/bite.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 liked_food = MEAT disliked_food = TOXIC @@ -75,7 +72,6 @@ attack_verb = "flutter" //wat? attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 liked_food = MEAT | FRUIT disliked_food = TOXIC @@ -105,7 +101,6 @@ skinned_type = /obj/item/stack/sheet/animalhide/xeno exotic_bloodtype = "L" damage_overlay_type = "xeno" - roundstart = 1 liked_food = MEAT //Praise the Omnissiah, A challange worthy of my skills - HS @@ -138,7 +133,6 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/xeno skinned_type = /obj/item/stack/sheet/animalhide/xeno // safe_toxins_max = 32 //Too much of anything is bad. - roundstart = 0 // whitelisted = 1 // whitelist = list("talkingcactus") //testing whitelisting @@ -182,7 +176,6 @@ punchdamagehigh = 14 punchstunthreshold = 13 blacklisted = 1 - roundstart = 0 whitelist = 1 whitelist = list("talkingcactus") @@ -233,7 +226,6 @@ attack_verb = "bite" attack_sound = 'sound/weapons/bite.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' -// roundstart = 1 whitelisted = 1 whitelist = list("rubyflamewing") blacklisted = 0 @@ -248,4 +240,3 @@ attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 84bf5bdf80..3881eae6f5 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -13,7 +13,6 @@ disliked_food = NONE liked_food = NONE toxic_food = NONE - roundstart = TRUE /datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index d75d3f4679..a326150c60 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -25,6 +25,10 @@ else if (light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) //heal in the dark H.heal_overall_damage(1,1) +/datum/species/shadow/check_roundstart_eligible() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + return TRUE + return ..() /datum/species/shadow/nightmare name = "Nightmare" @@ -61,7 +65,8 @@ return -1 return 0 - +/datum/species/shadow/nightmare/check_roundstart_eligible() + return FALSE //Organs diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index be03e591aa..acaa182ad0 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -11,3 +11,8 @@ damage_overlay_type = ""//let's not show bloody wounds or burns over bones. disliked_food = NONE liked_food = NONE + +/datum/species/skeleton/check_roundstart_eligible() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + return TRUE + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm index 45b4a28bb5..8b21c2a237 100644 --- a/code/modules/mob/living/carbon/human/species_types/synths.dm +++ b/code/modules/mob/living/carbon/human/species_types/synths.dm @@ -118,4 +118,4 @@ else return ..() else - return ..() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm new file mode 100644 index 0000000000..de0b5efdff --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -0,0 +1,130 @@ +/datum/species/vampire + name = "vampire" + id = "vampire" + default_color = "FFFFFF" + species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NOHUNGER,NOBREATH,DRINKSBLOOD) + mutant_bodyparts = list("tail_human", "ears", "wings") + default_features = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "wings" = "None") + exotic_bloodtype = "U" + use_skintones = TRUE + mutant_heart = /obj/item/organ/heart/vampire + mutanttongue = /obj/item/organ/tongue/vampire + blacklisted = TRUE + limbs_id = "human" + skinned_type = /obj/item/stack/sheet/animalhide/human + var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability." + +/datum/species/vampire/check_roundstart_eligible() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + return TRUE + return FALSE + +/datum/species/vampire/on_species_gain(mob/living/carbon/human/C, datum/species/old_species) + . = ..() + to_chat(C, "[info_text]") + C.skin_tone = "albino" + C.update_body(0) + if(C.mind) + var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new + C.mind.AddSpell(B) + +/datum/species/vampire/on_species_loss(mob/living/carbon/C) + . = ..() + if(C.mind) + for(var/S in C.mind.spell_list) + var/obj/effect/proc_holder/spell/S2 = S + if(S2.type == /obj/effect/proc_holder/spell/targeted/shapeshift/bat) + C.mind.spell_list.Remove(S2) + qdel(S2) + +/datum/species/vampire/spec_life(mob/living/carbon/human/C) + . = ..() + if(istype(C.loc, /obj/structure/closet/coffin)) + C.heal_overall_damage(4,4) + C.adjustToxLoss(-4) + C.adjustOxyLoss(-4) + C.adjustCloneLoss(-4) + return + C.blood_volume -= 1.5 + if(C.blood_volume <= BLOOD_VOLUME_SURVIVE) + to_chat(C, "You ran out of blood!") + C.dust() + var/area/A = get_area(C) + if(istype(A, /area/chapel)) + to_chat(C, "You don't belong here!") + C.adjustFireLoss(20) + C.adjust_fire_stacks(6) + C.IgniteMob() + +/obj/item/organ/tongue/vampire + name = "vampire tongue" + actions_types = list(/datum/action/item_action/organ_action/vampire) + color = "#1C1C1C" + var/drain_cooldown = 0 + +#define VAMP_DRAIN_AMOUNT 50 + +/datum/action/item_action/organ_action/vampire + name = "Drain Victim" + desc = "Leech blood from any carbon victim you are passively grabbing." + +/datum/action/item_action/organ_action/vampire/Trigger() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/H = owner + var/obj/item/organ/tongue/vampire/V = target + if(V.drain_cooldown >= world.time) + to_chat(H, "You just drained blood, wait a few seconds.") + return + if(H.pulling && iscarbon(H.pulling)) + var/mob/living/carbon/victim = H.pulling + if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) + to_chat(H, "You're already full!") + return + if(victim.stat == DEAD) + to_chat(H, "You need a living victim!") + return + if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || victim.dna.species.exotic_blood))) + to_chat(H, "[victim] doesn't have blood!") + return + V.drain_cooldown = world.time + 30 + if(!do_after(H, 30, target = victim)) + return + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood + var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) + to_chat(victim, "[H] is draining your blood!") + to_chat(H, "You drain some blood!") + playsound(H, 'sound/items/drink.ogg', 30, 1, -2) + victim.blood_volume = Clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + H.blood_volume = Clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) + if(!victim.blood_volume) + to_chat(H, "You finish off [victim]'s blood supply!") + +#undef VAMP_DRAIN_AMOUNT + +/obj/item/organ/heart/vampire + name = "vampire heart" + actions_types = list(/datum/action/item_action/organ_action/vampire_heart) + color = "#1C1C1C" + +/datum/action/item_action/organ_action/vampire_heart + name = "Check Blood Level" + desc = "Check how much blood you have remaining." + +/datum/action/item_action/organ_action/vampire_heart/Trigger() + . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/H = owner + to_chat(H, "Current blood level: [H.blood_volume]/[BLOOD_VOLUME_MAXIMUM].") + +/obj/effect/proc_holder/spell/targeted/shapeshift/bat + name = "Bat Form" + desc = "Take on the shape a space bat." + invocation = "Squeak!" + charge_max = 50 + cooldown_min = 50 + + shapeshift_type = /mob/living/simple_animal/hostile/retaliate/bat + current_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat) + current_casters = list() + possible_shapes = list(/mob/living/simple_animal/hostile/retaliate/bat) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 016a3635ef..8c87e1c9c9 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -14,6 +14,11 @@ disliked_food = NONE liked_food = NONE +/datum/species/zombie/check_roundstart_eligible() + if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) + return TRUE + return ..() + /datum/species/zombie/infectious name = "Infectious Zombie" id = "memezombies" @@ -24,6 +29,10 @@ mutanteyes = /obj/item/organ/eyes/night_vision/zombie var/regen_cooldown = 0 +/datum/species/zombie/infectious/check_roundstart_eligible() + return FALSE + + /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(2, amount) @@ -52,7 +61,7 @@ // Infection organ needs to be handled separately from mutant_organs // because it persists through species transitions var/obj/item/organ/zombie_infection/infection - infection = C.getorganslot("zombie_infection") + infection = C.getorganslot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() infection.Insert(C) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 71a05eb1f9..0d50285859 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -58,7 +58,7 @@ var/datum/gas_mixture/breath - if(!getorganslot("breathing_tube")) + if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE)) if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL)) losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath @@ -110,7 +110,7 @@ if((status_flags & GODMODE)) return - var/lungs = getorganslot("lungs") + var/lungs = getorganslot(ORGAN_SLOT_LUNGS) if(!lungs) adjustOxyLoss(2) @@ -230,7 +230,7 @@ if(internal.loc != src) internal = null update_internals_hud_icon(0) - else if ((!wear_mask || !(wear_mask.flags_1 & MASKINTERNALS_1)) && !getorganslot("breathing_tube")) + else if ((!wear_mask || !(wear_mask.flags_1 & MASKINTERNALS_1)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) internal = null update_internals_hud_icon(0) else @@ -401,7 +401,7 @@ ///////// /mob/living/carbon/proc/handle_liver() - var/obj/item/organ/liver/liver = getorganslot("liver") + var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if((!dna && !liver) || (NOLIVER in dna.species.species_traits)) return if(liver) @@ -414,17 +414,17 @@ liver_failure() /mob/living/carbon/proc/undergoing_liver_failure() - var/obj/item/organ/liver/liver = getorganslot("liver") + var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if(liver && liver.failing) return TRUE /mob/living/carbon/proc/return_liver_damage() - var/obj/item/organ/liver/liver = getorganslot("liver") + var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if(liver) return liver.damage /mob/living/carbon/proc/applyLiverDamage(var/d) - var/obj/item/organ/liver/L = getorganslot("liver") + var/obj/item/organ/liver/L = getorganslot(ORGAN_SLOT_LIVER) if(L) L.damage += d diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 2fcfe97d65..779e7f2f90 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -140,7 +140,7 @@ return protection /mob/living/carbon/monkey/IsVocal() - if(!getorganslot("lungs")) + if(!getorganslot(ORGAN_SLOT_LUNGS)) return 0 return 1 diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index d6ee2ebbfc..526a2ea09b 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -1,6 +1,6 @@ /mob/living/carbon/treat_message(message) message = ..(message) - var/obj/item/organ/tongue/T = getorganslot("tongue") + var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(!T) //hoooooouaah! var/regex/tongueless_lower = new("\[gdntke]+", "g") var/regex/tongueless_upper = new("\[GDNTKE]+", "g") @@ -21,7 +21,7 @@ /mob/living/carbon/get_spans() . = ..() - var/obj/item/organ/tongue/T = getorganslot("tongue") + var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) . |= T.get_spans() @@ -30,7 +30,7 @@ . |= I.get_held_item_speechspans(src) /mob/living/carbon/could_speak_in_language(datum/language/dt) - var/obj/item/organ/tongue/T = getorganslot("tongue") + var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(T) . = T.could_speak_in_language(dt) else diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 13a97c4407..ccd5f7296b 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -3,7 +3,7 @@ // eye damage, eye_blind, eye_blurry, druggy, BLIND disability, NEARSIGHT disability, and HUSK disability. /mob/living/carbon/damage_eyes(amount) - var/obj/item/organ/eyes/eyes = getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if (!eyes) return if(amount>0) @@ -15,7 +15,7 @@ overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, 1) /mob/living/carbon/set_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if (!eyes) return eyes.eye_damage = max(amount,0) @@ -28,7 +28,7 @@ clear_fullscreen("eye_damage") /mob/living/carbon/adjust_eye_damage(amount) - var/obj/item/organ/eyes/eyes = getorganslot("eye_sight") + var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES) if (!eyes) return eyes.eye_damage = max(eyes.eye_damage+amount, 0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 87092e580c..0cdcd90e61 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -898,14 +898,17 @@ to_chat(G, "Your summoner has changed form!") /mob/living/rad_act(amount) - amount = max(amount-RAD_BACKGROUND_RADIATION, 0) + if(!amount || amount < RAD_MOB_SKIN_PROTECTION) + return - if(amount) - var/blocked = getarmor(null, "rad") + amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated - apply_effect(amount * RAD_MOB_COEFFICIENT, IRRADIATE, blocked) - if(amount > RAD_AMOUNT_EXTREME) - apply_damage((amount-RAD_AMOUNT_EXTREME)/RAD_AMOUNT_EXTREME, BURN, null, blocked) + var/blocked = getarmor(null, "rad") + + if(amount > RAD_BURN_THRESHOLD) + apply_damage((amount-RAD_BURN_THRESHOLD)/RAD_BURN_THRESHOLD, BURN, null, blocked) + + apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), IRRADIATE, blocked) /mob/living/proc/fakefireextinguish() return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 9c34ca4dbd..7e3d1cd320 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( if(message_mode == MODE_VOCALCORDS) if(iscarbon(src)) var/mob/living/carbon/C = src - var/obj/item/organ/vocal_cords/V = C.getorganslot("vocal_cords") + var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE) if(V && V.can_speak_with()) V.handle_speech(message) //message V.speak_with(message) //action diff --git a/code/modules/mob/living/taste.dm b/code/modules/mob/living/taste.dm index 45fdf55fb4..c66168cee4 100644 --- a/code/modules/mob/living/taste.dm +++ b/code/modules/mob/living/taste.dm @@ -8,7 +8,7 @@ return DEFAULT_TASTE_SENSITIVITY /mob/living/carbon/get_taste_sensitivity() - var/obj/item/organ/tongue/tongue = getorganslot("tongue") + var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE) if(istype(tongue)) . = tongue.taste_sensitivity else diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 7073b98ca1..b7db29084a 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -139,7 +139,7 @@ #define BRAINS_BLOWN_THROW_RANGE 3 #define BRAINS_BLOWN_THROW_SPEED 1 /obj/item/gun/ballistic/suicide_act(mob/user) - var/obj/item/organ/brain/B = user.getorganslot("brain") + var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN) if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage) user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!") sleep(25) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index c114f7017b..cc91819611 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -38,7 +38,7 @@ All effects don't start immediately, but rather get worse over time; the rate is var/mob/living/carbon/human/H = M if(H.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER) H.drunkenness = max((H.drunkenness + (sqrt(volume) * boozepwr * ALCOHOL_RATE)), 0) //Volume, power, and server alcohol rate effect how quickly one gets drunk - var/obj/item/organ/liver/L = H.getorganslot("liver") + var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) H.applyLiverDamage((max(sqrt(volume) * boozepwr * L.alcohol_tolerance, 0))/10) return ..() || . diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index f1b076ca68..d25df998e3 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -550,7 +550,7 @@ if(!M.is_mouth_covered() && !M.is_eyes_covered()) unprotected = TRUE if(unprotected) - if(!M.getorganslot("eye_sight")) //can't blind somebody with no eyes + if(!M.getorganslot(ORGAN_SLOT_EYES)) //can't blind somebody with no eyes to_chat(M, "Your eye sockets feel wet.") else if(!M.eye_blurry) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index b83e651eda..095db17c7f 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -454,7 +454,7 @@ /datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M) if(M.radiation > 0) - M.radiation -= min(M.radiation, 4) + M.radiation -= min(M.radiation, 8) ..() /datum/reagent/medicine/pen_acid @@ -466,7 +466,7 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM /datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M) - M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/100 + M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50 M.adjustToxLoss(-2*REM, 0) for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) @@ -671,7 +671,7 @@ taste_description = "dull toxin" /datum/reagent/medicine/oculine/on_mob_life(mob/living/M) - var/obj/item/organ/eyes/eyes = M.getorganslot("eyes_sight") + var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return if(M.disabilities & BLIND) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 7f764e933e..c93ca30841 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -24,9 +24,9 @@ else //ingest, patch or inject M.ForceContractDisease(D) - if(method == INJECT && iscarbon(M)) + if(iscarbon(M)) var/mob/living/carbon/C = M - if(C.get_blood_id() == "blood") + if(C.get_blood_id() == "blood" && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) C.reagents.add_reagent("toxin", reac_volume * 0.5) else @@ -1596,7 +1596,7 @@ /datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H) // Silently add the zombie infection organ to be activated upon death - if(!H.getorganslot("zombie_infection")) + if(!H.getorganslot(ORGAN_SLOT_ZOMBIE)) var/obj/item/organ/zombie_infection/ZI = new() ZI.Insert(H) ..() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 2f2ef108ea..d4b8e165ee 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -65,6 +65,9 @@ /obj/item/reagent_containers/blood/lizard blood_type = "L" +/obj/item/reagent_containers/blood/universal + blood_type = "U" + /obj/item/reagent_containers/blood/empty name = "blood pack" icon_state = "empty" diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index cfa95f2d1a..a90b3598ce 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -253,7 +253,7 @@ if(VAULT_TOXIN) to_chat(H, "You feel resistant to airborne toxins.") if(locate(/obj/item/organ/lungs) in H.internal_organs) - var/obj/item/organ/lungs/L = H.internal_organs_slot["lungs"] + var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] L.tox_breath_dam_min = 0 L.tox_breath_dam_max = 0 S.species_traits |= VIRUSIMMUNE diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index ce1c4df56e..9099489420 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -1,38 +1,38 @@ -/datum/surgery/eye_surgery - name = "eye surgery" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) - species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) - possible_locs = list("eyes") - requires_bodypart_type = 0 - -//fix eyes -/datum/surgery_step/fix_eyes - name = "fix eyes" - implements = list(/obj/item/hemostat = 100, /obj/item/screwdriver = 45, /obj/item/pen = 25) - time = 64 - -/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/eyes/E = target.getorganslot("eye_sight") - if(!E) - to_chat(user, "It's hard to do surgery on someones eyes when they don't have any.") - return FALSE - -/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") - -/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") - target.cure_blind() - target.set_blindness(0) - target.cure_nearsighted() - target.blur_eyes(35) //this will fix itself slowly. - target.set_eye_damage(0) - return TRUE - -/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorgan(/obj/item/organ/brain)) - user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!") - target.adjustBrainLoss(100) - else - user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") - return FALSE +/datum/surgery/eye_surgery + name = "eye surgery" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list("eyes") + requires_bodypart_type = 0 + +//fix eyes +/datum/surgery_step/fix_eyes + name = "fix eyes" + implements = list(/obj/item/hemostat = 100, /obj/item/screwdriver = 45, /obj/item/pen = 25) + time = 64 + +/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) + if(!E) + to_chat(user, "It's hard to do surgery on someones eyes when they don't have any.") + return FALSE + +/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") + +/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") + target.cure_blind() + target.set_blindness(0) + target.cure_nearsighted() + target.blur_eyes(35) //this will fix itself slowly. + target.set_eye_damage(0) + return TRUE + +/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(target.getorgan(/obj/item/organ/brain)) + user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!") + target.adjustBrainLoss(100) + else + user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index ad51c48d85..35a2d851e3 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -2,7 +2,7 @@ name = "appendix" icon_state = "appendix" zone = "groin" - slot = "appendix" + slot = ORGAN_SLOT_APPENDIX var/inflamed = 0 /obj/item/organ/appendix/update_icon() diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index b51fc98f15..aa1ea10cd0 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -2,7 +2,6 @@ name = "arm-mounted implant" desc = "You shouldn't see this! Adminhelp and report this as an issue on github!" zone = "r_arm" - slot = "r_arm_device" icon_state = "implant-toolkit" w_class = WEIGHT_CLASS_NORMAL actions_types = list(/datum/action/item_action/organ_action/toggle) @@ -20,9 +19,18 @@ holder = new holder(src) update_icon() - slot = zone + "_device" + SetSlotFromZone() items_list = contents.Copy() +/obj/item/organ/cyberimp/arm/proc/SetSlotFromZone() + switch(zone) + if("l_arm") + slot = ORGAN_SLOT_LEFT_ARM_AUG + if("r_arm") + slot = ORGAN_SLOT_RIGHT_ARM_AUG + else + CRASH("Invalid zone for [type]") + /obj/item/organ/cyberimp/arm/update_icon() if(zone == "r_arm") transform = null @@ -40,7 +48,7 @@ zone = "l_arm" else zone = "r_arm" - slot = zone + "_device" + SetSlotFromZone() to_chat(user, "You modify [src] to be installed on the [zone == "r_arm" ? "right" : "left"] arm.") update_icon() else if(istype(W, /obj/item/card/emag)) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 70a8f05b8a..1e93c4df4a 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -13,7 +13,7 @@ var/hunger_threshold = NUTRITION_LEVEL_STARVING var/synthesizing = 0 var/poison_amount = 5 - slot = "stomach" + slot = ORGAN_SLOT_STOMACH origin_tech = "materials=2;powerstorage=2;biotech=2" /obj/item/organ/cyberimp/chest/nutriment/on_life() @@ -51,7 +51,7 @@ icon_state = "chest_implant" implant_color = "#AD0000" origin_tech = "materials=5;programming=4;biotech=4" - slot = "heartdrive" + slot = ORGAN_SLOT_HEART_AID var/revive_cost = 0 var/reviving = 0 var/cooldown = 0 @@ -119,8 +119,8 @@ /obj/item/organ/cyberimp/chest/thrusters name = "implantable thrusters set" desc = "An implantable set of thruster ports. They use the gas from environment or subject's internals for propulsion in zero-gravity areas. \ - Unlike regular jetpacks, this device has no stabilization system." - slot = "thrusters" + Unlike regular jetpack, this device has no stabilization system." + slot = ORGAN_SLOT_THRUSTERS icon_state = "imp_jetpack" origin_tech = "materials=4;magnets=4;biotech=4;engineering=5" implant_overlay = null diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 62b427f883..f928db5dd6 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -3,7 +3,7 @@ desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" implant_overlay = "eye_implant_overlay" - slot = "eye_sight" + slot = ORGAN_SLOT_EYES zone = "eyes" w_class = WEIGHT_CLASS_TINY @@ -11,7 +11,7 @@ /obj/item/organ/cyberimp/eyes/hud name = "HUD implant" desc = "These cybernetic eyes will display a HUD over everything you see. Maybe." - slot = "eye_hud" + slot = ORGAN_SLOT_HUD var/HUD_type = 0 /obj/item/organ/cyberimp/eyes/hud/Insert(var/mob/living/carbon/M, var/special = 0, drop_if_replaced = FALSE) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 9b3c23b3a8..a6c1517faa 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -44,7 +44,7 @@ var/active = 0 var/list/stored_items = list() implant_color = "#DE7E00" - slot = "brain_antidrop" + slot = ORGAN_SLOT_BRAIN_ANTIDROP origin_tech = "materials=4;programming=5;biotech=4" actions_types = list(/datum/action/item_action/organ_action/toggle) @@ -101,7 +101,7 @@ name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." implant_color = "#FFFF00" - slot = "brain_antistun" + slot = ORGAN_SLOT_BRAIN_ANTISTUN origin_tech = "materials=5;programming=4;biotech=5" /obj/item/organ/cyberimp/brain/anti_stun/on_life() @@ -133,7 +133,7 @@ name = "breathing tube implant" desc = "This simple implant adds an internals connector to your back, allowing you to use internals without a mask and protecting you from being choked." icon_state = "implant_mask" - slot = "breathing_tube" + slot = ORGAN_SLOT_BREATHING_TUBE w_class = WEIGHT_CLASS_TINY origin_tech = "materials=2;biotech=3" diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index f8a310c8f7..e3aaec0266 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -3,7 +3,7 @@ icon_state = "ears" desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible." zone = "head" - slot = "ears" + slot = ORGAN_SLOT_EARS gender = PLURAL // `deaf` measures "ticks" of deafness. While > 0, the person is unable diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index ddb6eb453f..75d4aa0bcc 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -3,7 +3,7 @@ icon_state = "eyeballs" desc = "I see you!" zone = "eyes" - slot = "eye_sight" + slot = ORGAN_SLOT_EYES gender = PLURAL var/sight_flags = 0 diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 19bed38293..30825f46bb 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -3,7 +3,7 @@ desc = "I feel bad for the heartless bastard who lost this." icon_state = "heart-on" zone = "chest" - slot = "heart" + slot = ORGAN_SLOT_HEART origin_tech = "biotech=5" // Heart attack code is in code/modules/mob/living/carbon/human/life.dm var/beating = 1 diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index eae5e8aee8..352958d9b8 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -8,7 +8,7 @@ origin_tech = "biotech=3" w_class = WEIGHT_CLASS_NORMAL zone = "chest" - slot = "liver" + slot = ORGAN_SLOT_LIVER desc = "Pairing suggestion: chianti and fava beans." var/damage = 0 //liver damage, 0 is no damage, damage=maxHealth causes liver failure var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 7fd1b9bf6d..65c1e3e1fb 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -12,7 +12,7 @@ name = "lungs" icon_state = "lungs" zone = "chest" - slot = "lungs" + slot = ORGAN_SLOT_LUNGS gender = PLURAL w_class = WEIGHT_CLASS_NORMAL diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 596cb0fbd3..85a6b098e1 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -118,7 +118,7 @@ var/has_liver = (!(NOLIVER in dna.species.species_traits)) var/has_stomach = (!(NOSTOMACH in dna.species.species_traits)) - if(has_liver && !getorganslot("liver")) + if(has_liver && !getorganslot(ORGAN_SLOT_LIVER)) var/obj/item/organ/liver/LI if(dna.species.mutantliver) @@ -127,7 +127,7 @@ LI = new() LI.Insert(src) - if(has_stomach && !getorganslot("stomach")) + if(has_stomach && !getorganslot(ORGAN_SLOT_STOMACH)) var/obj/item/organ/stomach/S if(dna.species.mutantstomach) @@ -136,15 +136,15 @@ S = new() S.Insert(src) - if(breathes && !getorganslot("lungs")) + if(breathes && !getorganslot(ORGAN_SLOT_LUNGS)) var/obj/item/organ/lungs/L = new() L.Insert(src) - if(blooded && !getorganslot("heart")) + if(blooded && !getorganslot(ORGAN_SLOT_HEART)) var/obj/item/organ/heart/H = new() H.Insert(src) - if(!getorganslot("tongue")) + if(!getorganslot(ORGAN_SLOT_TONGUE)) var/obj/item/organ/tongue/T if(dna && dna.species && dna.species.mutanttongue) @@ -155,7 +155,7 @@ // if they have no mutant tongues, give them a regular one T.Insert(src) - if(!getorganslot("eye_sight")) + if(!getorganslot(ORGAN_SLOT_EYES)) var/obj/item/organ/eyes/E if(dna && dna.species && dna.species.mutanteyes) @@ -165,7 +165,7 @@ E = new() E.Insert(src) - if(!getorganslot("ears")) + if(!getorganslot(ORGAN_SLOT_EARS)) var/obj/item/organ/ears/ears if(dna && dna.species && dna.species.mutantears) ears = new dna.species.mutantears diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 36cd28ac98..2bf34334f4 100755 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -4,7 +4,7 @@ origin_tech = "biotech=4" w_class = WEIGHT_CLASS_NORMAL zone = "chest" - slot = "stomach" + slot = ORGAN_SLOT_STOMACH attack_verb = list("gored", "squished", "slapped", "digested") desc = "Onaka ga suite imasu." var/disgust_metabolism = 1 diff --git a/code/modules/surgery/organs/tails.dm b/code/modules/surgery/organs/tails.dm index 99d1ed2442..a909463585 100644 --- a/code/modules/surgery/organs/tails.dm +++ b/code/modules/surgery/organs/tails.dm @@ -2,7 +2,7 @@ name = "tail" desc = "What did you cut this off of?" zone = "groin" - slot = "tail" + slot = ORGAN_SLOT_TAIL /obj/item/organ/tail/cat name = "cat tail" diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 449e88dc58..6420d8610e 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -3,7 +3,7 @@ desc = "A fleshy muscle mostly used for lying." icon_state = "tonguenormal" zone = "mouth" - slot = "tongue" + slot = ORGAN_SLOT_TONGUE attack_verb = list("licked", "slobbered", "slapped", "frenched", "tongued") var/list/languages_possible var/say_mod = null @@ -83,7 +83,7 @@ var/mob/living/carbon/human/user = usr var/rendered = "[user.name]: [message]" for(var/mob/living/carbon/human/H in GLOB.living_mob_list) - var/obj/item/organ/tongue/T = H.getorganslot("tongue") + var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE) if(!T || T.type != type) continue if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor") diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8b7f325f22..85dc2ae1c3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -7,7 +7,7 @@ name = "vocal cords" icon_state = "appendix" zone = "mouth" - slot = "vocal_cords" + slot = ORGAN_SLOT_VOICE gender = PLURAL var/list/spans = null @@ -24,15 +24,13 @@ name = "adamantine resonator" desc = "Fragments of adamantine exist in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders." zone = "head" - slot = "adamantine_resonator" + slot = ORGAN_SLOT_ADAMANTINE_RESONATOR icon_state = "adamantine_resonator" /obj/item/organ/vocal_cords/adamantine name = "adamantine vocal cords" desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems." actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) - zone = "mouth" - slot = "vocal_cords" icon_state = "adamantine_cords" /datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger() @@ -48,7 +46,7 @@ for(var/m in GLOB.player_list) if(iscarbon(m)) var/mob/living/carbon/C = m - if(C.getorganslot("adamantine_resonator")) + if(C.getorganslot(ORGAN_SLOT_ADAMANTINE_RESONATOR)) to_chat(C, msg) if(isobserver(m)) var/link = FOLLOW_LINK(m, owner) @@ -59,8 +57,6 @@ name = "divine vocal cords" desc = "They carry the voice of an ancient god." icon_state = "voice_of_god" - zone = "mouth" - slot = "vocal_cords" actions_types = list(/datum/action/item_action/organ_action/colossus) var/next_command = 0 var/cooldown_mod = 1 diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 8db4e492e4..f203af610a 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -44,7 +44,7 @@ return var/obj/item/organ/zombie_infection/infection - infection = target.getorganslot("zombie_infection") + infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) if(!infection) infection = new() infection.Insert(target) diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 81d3457d40..0b7a54ee1f 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -2,7 +2,7 @@ name = "festering ooze" desc = "A black web of pus and viscera." zone = "head" - slot = "zombie_infection" + slot = ORGAN_SLOT_ZOMBIE icon_state = "blacktumor" origin_tech = "biotech=5" var/datum/species/old_species = /datum/species/human diff --git a/config/game_options.txt b/config/game_options.txt index e835a4b1a6..d3fa274ed8 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -395,6 +395,13 @@ JOIN_WITH_MUTANT_RACE ## You probably want humans on your space station, but technically speaking you can turn them off without any ill effect ROUNDSTART_RACES human +ROUNDSTART_RACES mammal +ROUNDSTART_RACES avian +ROUNDSTART_RACES aquatic +ROUNDSTART_RACES insect +ROUNDSTART_RACES xeno +ROUNDSTART_RACES datashark +ROUNDSTART_RACES guilmon ## Races that are strictly worse than humans that could probably be turned on without balance concerns ROUNDSTART_RACES lizard diff --git a/html/changelogs/AutoChangeLog-pr-3524.yml b/html/changelogs/AutoChangeLog-pr-3524.yml new file mode 100644 index 0000000000..8966133a1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3524.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "You can now select your Halloween race, rather than having it assigned randomly via event." diff --git a/html/changelogs/AutoChangeLog-pr-3630.yml b/html/changelogs/AutoChangeLog-pr-3630.yml new file mode 100644 index 0000000000..0c69e04f40 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3630.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "Admins are now able to mark open tickets as being handled. This makes it easier for staff members to provide feedback to players reporting issues via the admin help button." diff --git a/html/changelogs/AutoChangeLog-pr-3649.yml b/html/changelogs/AutoChangeLog-pr-3649.yml new file mode 100644 index 0000000000..04a9765da6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3649.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Cable coils will no longer appear as weirdly colored APCs" diff --git a/html/changelogs/AutoChangeLog-pr-3663.yml b/html/changelogs/AutoChangeLog-pr-3663.yml new file mode 100644 index 0000000000..7fe666a739 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3663.yml @@ -0,0 +1,4 @@ +author: "Mark9013100" +delete-after: True +changes: + - tweak: "The Medical Cloning manual has been updated." diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index b5ac65c2a8..636d895450 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index e1604715ac..5482873c8a 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/turf/overlays.dmi b/icons/turf/overlays.dmi index 34819bdca9..c1867fb12f 100644 Binary files a/icons/turf/overlays.dmi and b/icons/turf/overlays.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 74d470b907..8eb4c8126a 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -379,6 +379,7 @@ #include "code\datums\helper_datums\icon_snapshot.dm" #include "code\datums\helper_datums\teleport.dm" #include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\item_sounds.dm" #include "code\datums\looping_sounds\looping_sound.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" #include "code\datums\martial\boxing.dm" @@ -1733,6 +1734,7 @@ #include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" #include "code\modules\mob\living\carbon\human\species_types\synths.dm" +#include "code\modules\mob\living\carbon\human\species_types\vampire.dm" #include "code\modules\mob\living\carbon\human\species_types\zombies.dm" #include "code\modules\mob\living\carbon\monkey\combat.dm" #include "code\modules\mob\living\carbon\monkey\death.dm" diff --git a/tools/travis/build_tools.sh b/tools/travis/build_tools.sh index 2e9810b470..193ad261a6 100755 --- a/tools/travis/build_tools.sh +++ b/tools/travis/build_tools.sh @@ -7,6 +7,8 @@ if [ "$BUILD_TOOLS" = true ]; then md5sum -c - <<< "49bc6b1b9ed56c83cceb6674bd97cb34 *html/changelogs/example.yml"; cd tgui && source ~/.nvm/nvm.sh && gulp && cd ..; - php5.6 -l tools/WebhookProcessor/github_webhook_processor.php; + phpenv global 5.6 + php -l tools/WebhookProcessor/github_webhook_processor.php; + php -l tools/TGUICompiler.php; python tools/ss13_genchangelog.py html/changelog.html html/changelogs; fi; |