diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 0aa113b0f68..756ae54765f 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -27,12 +27,6 @@ #define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station #define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. -//Shuttle moving status -#define SHUTTLE_IDLE 0 -#define SHUTTLE_WARMUP 1 -#define SHUTTLE_INTRANSIT 2 -#define SHUTTLE_STRANDED 3 - //Ferry shuttle processing status #define IDLE_STATE 0 #define WAIT_LAUNCH 1 diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index c7ef656bff2..f16d5b1c396 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -120,7 +120,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) else emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) @@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 return if(ticker.mode.name == "meteor") return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) return else diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 30b12c88e81..e65ced5c08c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -36,7 +36,7 @@ var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard var/traitor_scaling = 0 //if amount of traitors scales based on amount of players var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other - var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/Ticklag = 0.9 @@ -449,7 +449,7 @@ config.gateway_delay = text2num(value) if("continuous_rounds") - config.continous_rounds = 1 + config.continuous_rounds = 1 if("ghost_interaction") config.ghost_interaction = 1 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index ec1c34fee60..236b7c8e9b1 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin caster.reset_view(0) return 0 - if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + return 0 + if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages") return 0 if(!skipcharge) diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index 31c09813863..a115406548c 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -20,9 +20,9 @@ action_icon_state = "skeleton" /obj/effect/proc_holder/spell/targeted/lichdom/New() - if(!config.continous_rounds) + if(!config.continuous_rounds) existence_stops_round_end = 1 - config.continous_rounds = 1 + config.continuous_rounds = 1 ..() /obj/effect/proc_holder/spell/targeted/lichdom/Destroy() @@ -31,7 +31,7 @@ if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) return ..() if(existence_stops_round_end) - config.continous_rounds = 0 + config.continuous_rounds = 0 return ..() /obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index bbdbea1c724..69403bc5d8e 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -7,7 +7,6 @@ var/round_start_time = 0 var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null - var/post_game = 0 var/event_time = null var/event = 0 @@ -386,16 +385,13 @@ var/round_start_time = 0 //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - var/game_finished = 0 - var/mode_finished = 0 - if (config.continous_rounds) - game_finished = (mode.station_was_nuked) - mode_finished = (!post_game && mode.check_finished()) + var/game_finished = shuttle_master.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if (config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result else - game_finished = (mode.check_finished()) - mode_finished = game_finished + game_finished |= mode.check_finished() - if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game)) + if(!mode.explosion_in_progress && game_finished) current_state = GAME_STATE_FINISHED auto_toggle_ooc(1) // Turn it on spawn @@ -409,18 +405,6 @@ var/round_start_time = 0 else world.Reboot("Round ended.", "end_proper", "proper completion") - else if (mode_finished) - post_game = 1 - - mode.cleanup() - - //call a transfer shuttle vote - spawn(50) - if(!round_end_announced) // Spam Prevention. Now it should announce only once. - world << "\red The round has ended!" - round_end_announced = 1 - vote.autotransfer() - return 1 proc/getfactionbyname(var/name) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 4d436e29ca9..cc38ef0ef9f 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -148,7 +148,7 @@ if (station_captured && !to_nuke_or_not_to_nuke) return 1 if (is_malf_ai_dead()) - if(config.continous_rounds) + if(config.continuous_rounds) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 malf_mode_declared = 0 diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 34ec44a4245..6926c7f6067 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -111,10 +111,7 @@ ..() statpanel("Status") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() if (client.statpanel == "Status") stat("Chemicals", chemicals) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 99f0f98e256..7b056987953 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -262,6 +262,9 @@ /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting." +/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Destroying this vehicle would destroy us. Aborting." + /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 345114a4088..74e81484c97 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -203,15 +203,11 @@ //Checks if the round is over// /////////////////////////////// /datum/game_mode/revolution/check_finished() - if(config.continous_rounds) + if(config.continuous_rounds) if(finished != 0) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 - return ..() - if(finished != 0) - return 1 - else - return 0 + return finished != 0 /////////////////////////////////////////////////// //Deals with converting players to the revolution// diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 7092469efd1..77703c53715 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -1,5 +1,5 @@ /datum/game_mode/wizard/raginmages - name = "Ragin' Mages" + name = "ragin' mages" config_tag = "raginmages" required_players = 1 required_players_secret = 15 diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index d0c6f059f26..b6052320615 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,15 +1,19 @@ /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg") - var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") + var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") + usr << "You summoned [summon_type ? "magic" : "guns"]!" message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + for(var/mob/living/carbon/human/H in player_list) - if(H.stat == 2 || !(H.client)) continue + if(H.stat == 2 || !(H.client)) + continue if(H.mind) - if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue + if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") + continue var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) @@ -25,43 +29,65 @@ new /obj/item/weapon/gun/projectile/revolver(get_turf(H)) if("detective") new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H)) - if("c20r") - new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) - if("nuclear") - new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("deagle") new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) if("gyrojet") new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) if("pulse") new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H)) - if("silenced") + if("suppressed") new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H)) new /obj/item/weapon/suppressor(get_turf(H)) - if("cannon") - new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) if("doublebarrel") new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H)) if("shotgun") - new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H)) + new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) if("combatshotgun") new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) - if("bulldog") - new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) if("arg") new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) + if("boltaction") + new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("uzi") + new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H)) + if("cannon") + new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) + if("crossbow") + new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H)) + if("nuclear") + new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("sabr") new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H)) - if("crossbow") - new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H)) + if("bulldog") + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) + if("c20r") + new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) if("saw") new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) - if("boltaction") - new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("turret") + new /obj/item/weapon/gun/energy/gun/turret(get_turf(H)) + if("pulsecarbine") + new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H)) + if("decloner") + new /obj/item/weapon/gun/energy/decloner(get_turf(H)) + if("mindflayer") + new /obj/item/weapon/gun/energy/mindflayer(get_turf(H)) + if("hyperkinetic") + new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H)) + if("advplasmacutter") + new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H)) + if("wormhole") + new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H)) + if("wt550") + new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H)) + if("grenadelauncher") + new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H)) + if("medibeam") + new /obj/item/weapon/gun/medbeam(get_turf(H)) else switch (randomizemagic) if("fireball") @@ -80,6 +106,8 @@ new /obj/item/weapon/spellbook/oneuse/horsemask(get_turf(H)) if("charge") new /obj/item/weapon/spellbook/oneuse/charge(get_turf(H)) + if("summonitem") + new /obj/item/weapon/spellbook/oneuse/summonitem(get_turf(H)) if("wandnothing") new /obj/item/weapon/gun/magic/wand(get_turf(H)) if("wanddeath") @@ -109,10 +137,8 @@ H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO H << "The walls suddenly disappear." - if("voodoo") new /obj/item/voodoo(get_turf(H)) - if("special") magiclist -= "special" //only one super OP item per summoning max switch (randomizemagicspecial) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 1f91e489934..83c23311297 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -412,6 +412,12 @@ cost = 0 log_name = "SG" +/datum/spellbook_entry/summon/guns/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(0) @@ -427,6 +433,12 @@ cost = 0 log_name = "SU" +/datum/spellbook_entry/summon/magic/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(1) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 2f34c567dd3..37a6c801573 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -203,10 +203,6 @@ /datum/game_mode/wizard/check_finished() - - if(config.continous_rounds) - return ..() - var/wizards_alive = 0 var/traitors_alive = 0 for(var/datum/mind/wizard in wizards) diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index f30debb7e98..4ae05c7dd21 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -135,15 +135,7 @@ return ..() /datum/game_mode/xenos/check_finished() - if(config.continous_rounds) - if(result) - return ..() - if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) - return ..() - if(result || station_was_nuked) - return 1 - else - return 0 + return result != 0 /datum/game_mode/xenos/proc/xenos_alive() var/list/livingxenos = list() diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index f3e6de46321..5251898e7c7 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -1,4 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +#define OP_COMPUTER_COOLDOWN 60 /obj/machinery/computer/operating name = "operating computer" @@ -7,10 +8,18 @@ icon_keyboard = "med_key" icon_screen = "crew" circuit = /obj/item/weapon/circuitboard/operating - var/mob/living/carbon/human/victim = null var/obj/machinery/optable/table = null - + var/mob/living/carbon/human/victim = null light_color = LIGHT_COLOR_PURE_BLUE + var/verbose = 1 //general speaker toggle + var/patientName = null + var/oxyAlarm = 30 //oxy damage at which the computer will beep + var/choice = 0 //just for going into and out of the options menu + var/healthAnnounce = 1 //healther announcer toggle + var/crit = 1 //crit beeping toggle + var/nextTick = OP_COMPUTER_COOLDOWN + var/healthAlarm = 50 + var/oxy = 1 //oxygen beeping toggle /obj/machinery/computer/operating/New() ..() @@ -24,7 +33,7 @@ add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) return - interact(user) + ui_interact(user) /obj/machinery/computer/operating/attack_hand(mob/user) @@ -36,45 +45,119 @@ add_fingerprint(user) - interact(user) + ui_interact(user) + + +///obj/machinery/computer/operating/interact(mob/user) +// if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) ) +// if (!istype(user, /mob/living/silicon)) +// user.unset_machine() +// user << browse(null, "window=op") +// return +// +// user.set_machine(src) +// var/dat = "Operating Computer\n" +// dat += "Close

" //| Update" +// if(src.table && (src.table.check_victim())) +// src.victim = src.table.victim +// dat += {" +//Patient Information:
+//
+//Name: [src.victim.real_name]
+//Age: [src.victim.age]
+//Blood Type: [src.victim.b_type]
+//
+//Health: [src.victim.health]
+//Brute Damage: [src.victim.getBruteLoss()]
+//Toxins Damage: [src.victim.getToxLoss()]
+//Fire Damage: [src.victim.getFireLoss()]
+//Suffocation Damage: [src.victim.getOxyLoss()]
+//Patient Status: [src.victim.stat ? "Non-Responsive" : "Awake"]
+//Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
+//"} +// else +// src.victim = null +// dat += {" +//Patient Information:
+//
+//No Patient Detected +//"} +// user << browse(dat, "window=op") +// onclose(user, "op") + +/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)//ui is mostly copy pasta from the sleeper ui + var/data[0] + var/mob/living/carbon/human/occupant = src.table.victim + data["hasOccupant"] = occupant ? 1 : 0 + var/occupantData[0] + + if (occupant) + occupantData["name"] = occupant.name + occupantData["stat"] = occupant.stat + occupantData["health"] = occupant.health + occupantData["maxHealth"] = occupant.maxHealth + occupantData["minHealth"] = config.health_threshold_dead + occupantData["bruteLoss"] = occupant.getBruteLoss() + occupantData["oxyLoss"] = occupant.getOxyLoss() + occupantData["toxLoss"] = occupant.getToxLoss() + occupantData["fireLoss"] = occupant.getFireLoss() + occupantData["paralysis"] = occupant.paralysis + occupantData["hasBlood"] = 0 + occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations + // Because we can put simple_animals in here, we need to do something tricky to get things working nice + occupantData["temperatureSuitability"] = 0 // 0 is the baseline + if (ishuman(occupant) && occupant.species) + var/datum/species/sp = occupant.species + if (occupant.bodytemperature < sp.cold_level_3) + occupantData["temperatureSuitability"] = -3 + else if (occupant.bodytemperature < sp.cold_level_2) + occupantData["temperatureSuitability"] = -2 + else if (occupant.bodytemperature < sp.cold_level_1) + occupantData["temperatureSuitability"] = -1 + else if (occupant.bodytemperature > sp.heat_level_3) + occupantData["temperatureSuitability"] = 3 + else if (occupant.bodytemperature > sp.heat_level_2) + occupantData["temperatureSuitability"] = 2 + else if (occupant.bodytemperature > sp.heat_level_1) + occupantData["temperatureSuitability"] = 1 + else if (istype(occupant, /mob/living/simple_animal)) + var/mob/living/simple_animal/silly = occupant + if (silly.bodytemperature < silly.minbodytemp) + occupantData["temperatureSuitability"] = -3 + else if (silly.bodytemperature > silly.maxbodytemp) + occupantData["temperatureSuitability"] = 3 + // Blast you, imperial measurement system + occupantData["btCelsius"] = occupant.bodytemperature - T0C + occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32 + + if (ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) + occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) + occupantData["hasBlood"] = 1 + occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount("blood")) + occupantData["bloodMax"] = occupant.max_blood + occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount("blood")/occupant.max_blood), 0.01) //copy pasta ends here + + occupantData["bloodType"]=occupant.b_type + + data["occupant"] = occupantData + data["verbose"]=verbose + data["oxyAlarm"]=oxyAlarm + data["choice"]=choice + data["health"]=healthAnnounce + data["crit"]=crit + data["healthAlarm"]=healthAlarm + data["oxy"]=oxy + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 455) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) -/obj/machinery/computer/operating/interact(mob/user) - if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=op") - return - user.set_machine(src) - var/dat = "Operating Computer\n" - dat += "Close

" //| Update" - if(src.table && (src.table.check_victim())) - src.victim = src.table.victim - dat += {" -Patient Information:
-
-Name: [src.victim.real_name]
-Age: [src.victim.age]
-Blood Type: [src.victim.b_type]
-
-Health: [src.victim.health]
-Brute Damage: [src.victim.getBruteLoss()]
-Toxins Damage: [src.victim.getToxLoss()]
-Fire Damage: [src.victim.getFireLoss()]
-Suffocation Damage: [src.victim.getOxyLoss()]
-Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
-Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
-"} - else - src.victim = null - dat += {" -Patient Information:
-
-No Patient Detected -"} - user << browse(dat, "window=op") - onclose(user, "op") /obj/machinery/computer/operating/Topic(href, href_list) @@ -82,9 +165,48 @@ return 1 if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) + + if(href_list["verboseOn"]) + verbose=1 + if(href_list["verboseOff"]) + verbose=0 + if(href_list["healthOn"]) + healthAnnounce=1 + if(href_list["healthOff"]) + healthAnnounce=0 + if(href_list["critOn"]) + crit=1 + if(href_list["critOff"]) + crit=0 + if(href_list["oxyOn"]) + oxy=1 + if(href_list["oxyOff"]) + oxy=0 + if(href_list["oxy_adj"]!=0) + oxyAlarm=oxyAlarm+text2num(href_list["oxy_adj"]) + if(href_list["choiceOn"]) + choice=1 + if(href_list["choiceOff"]) + choice=0 + if(href_list["health_adj"]!=0) + healthAlarm=healthAlarm+text2num(href_list["health_adj"]) return /obj/machinery/computer/operating/process() - if(..()) - src.updateDialog() + + if(table && table.check_victim()) + if(verbose) + if(patientName!=table.victim.name) + patientName=table.victim.name + atom_say("New patient detected, loading stats") + victim = table.victim + atom_say("[victim.real_name], [victim.b_type] blood, [victim.stat ? "Non-Responsive" : "Awake"]") + if(nextTick < world.time) + nextTick=world.time + OP_COMPUTER_COOLDOWN + if(crit && victim.health <= -50 ) + playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0) + if(oxy && victim.getOxyLoss()>oxyAlarm) + playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0) + if(healthAnnounce && victim.health <= healthAlarm) + atom_say("[round(victim.health)]") diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 9dede30f469..ea2dadda3b4 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -437,7 +437,7 @@ user << "Under directive 7-10, [station_name()] is quarantined until further notice." return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. shuttle_master.emergency.request(null, 0.5, null, " Automatic Crew Transfer", 1) else shuttle_master.emergency.request(null, 1, null, " Automatic Crew Transfer", 0) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a211c7d0fda..83e1f3f723e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -882,8 +882,8 @@ About the new airlock wires panel: src.closeOther.close() return ..() -/obj/machinery/door/airlock/close(var/forced=0) - if(operating || welded || locked) +/obj/machinery/door/airlock/close(var/forced=0, var/override = 0) + if((operating & !override) || welded || locked) return if(!forced) //despite the name, this wire is for general door control. @@ -918,11 +918,11 @@ About the new airlock wires panel: operating = 1 do_animate("closing") src.layer = 3.1 - sleep(5) + if (!override) sleep(5) src.density = 1 if(!safe) crush() - sleep(5) + if(!override) sleep(5) update_icon() if(visible && !glass) set_opacity(1) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 17e35850d8c..d0477eead0d 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -271,7 +271,7 @@ singular_name = "glass sheet" icon_state = "sheet-plasmaglass" materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmabasic var/full_window = /obj/structure/window/full/plasmabasic @@ -360,7 +360,7 @@ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-plasmarglass" materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmareinforced var/full_window = /obj/structure/window/full/plasmareinforced diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ecdb2ac28ad..6a3493fc0ea 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1753,4 +1753,33 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/figure/warden name = "Warden action figure" icon_state = "warden" - toysay = "Execute him for breaking in!" \ No newline at end of file + toysay = "Execute him for breaking in!" + +////////////////////////////////////////////////////// +// Magic 8-Ball / Conch // +////////////////////////////////////////////////////// + +/obj/item/toy/eight_ball + name = "Magic 8-Ball" + desc = "Mystical! Magical! Ages 8+!" + icon = 'icons/obj/toy.dmi' + icon_state = "eight-ball" + var/use_action = "shakes the ball" + var/cooldown = 0 + var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") + +/obj/item/toy/eight_ball/attack_self(mob/user as mob) + if(!cooldown) + var/answer = pick(possible_answers) + user.visible_message("[user] focuses on their question and [use_action]...") + user.visible_message("\icon[src] The [src] says \"[answer]\"") + spawn(30) + cooldown = 0 + return + +/obj/item/toy/eight_ball/conch + name = "Magic Conch Shell" + desc = "All hail the Magic Conch!" + icon_state = "conch" + use_action = "pulls the string" + possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.") \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index fa10ce2daf8..ac5897367f8 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -461,7 +461,7 @@ max_fuel = 40 w_class = 3.0 materials = list(MAT_METAL=70, MAT_GLASS=120) - origin_tech = "engineering=4;plasma=3" + origin_tech = "engineering=4;plasmatech=3" var/last_gen = 0 change_icons = 0 can_off_process = 1 diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index fa525e22e1f..cca76f4b42b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -1,5 +1,54 @@ /mob/var/suiciding = 0 +/mob/living/carbon/human/proc/do_suicide(damagetype, byitem) + var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2 + var/dmgamt = maxHealth - threshold + + var/damage_mod = 1 + switch(damagetype) //Sorry about the magic numbers. + //brute = 1, burn = 2, tox = 4, oxy = 8 + if(15) //4 damage types + damage_mod = 4 + + if(6, 11, 13, 14) //3 damage types + damage_mod = 3 + + if(3, 5, 7, 9, 10, 12) //2 damage types + damage_mod = 2 + + if(1, 2, 4, 8) //1 damage type + damage_mod = 1 + + else //This should not happen, but if it does, everything should still work + damage_mod = 1 + + //Do dmgamt damage divided by the number of damage types applied. + if(damagetype & BRUTELOSS) + adjustBruteLoss(dmgamt / damage_mod) + + if(damagetype & FIRELOSS) + adjustFireLoss(dmgamt / damage_mod) + + if(damagetype & TOXLOSS) + adjustToxLoss(dmgamt / damage_mod) + + if(damagetype & OXYLOSS) + adjustOxyLoss(dmgamt / damage_mod) + + // Failing that... + if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS)) + if(species.flags & NO_BREATHE) + // the ultimate fallback + take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0) + else + adjustOxyLoss(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + + var/obj/item/organ/external/affected = get_organ("head") + if(affected) + affected.add_autopsy_data(byitem ? "Suicide by [byitem]" : "Suicide", dmgamt) + + updatehealth() + /mob/living/carbon/human/verb/suicide() set hidden = 1 @@ -24,56 +73,11 @@ if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(175/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide by [held_item]", 175) - - updatehealth() + do_suicide(damagetype, held_item) return - - viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ - "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ - "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ - "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.") - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide", 175) + viewers(src) << "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide." + do_suicide(0) updatehealth() diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 30374d31a52..960ead4a0b6 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -17,7 +17,7 @@ playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10) icon_state = "prizeconfetti" src.color = pick(random_color_list) - var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure) //will add ticket bundles later + var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later spawn(10) user.unEquip(src) new prize_inside(user.loc) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 23d2bcb7bdf..44bb65e9e10 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -57,13 +57,6 @@ else integrated_ai.get_rig_stats = 0 -/mob/living/Stat() - . = ..() - if(. && get_rig_stats) - var/obj/item/weapon/rig/rig = get_rig() - if(rig) - SetupStat(rig) - /obj/item/rig_module/ai_container/proc/update_verb_holder() if(!verb_holder) verb_holder = new(src) diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 183255ca635..6e19fab742c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -225,13 +225,6 @@ /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) return 0 -/mob/living/carbon/human/Stat() - . = ..() - - if(. && istype(back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/R = back - SetupStat(R) - /mob/proc/SetupStat(var/obj/item/weapon/rig/R) if(R && (R.flags & NODROP) && R.installed_modules.len && statpanel("Hardsuit Modules")) var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2716ba0a439..90b568110b3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -210,7 +210,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() statpanel("Status") if (client.statpanel == "Status") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker) if(ticker.mode) //world << "DEBUG: ticker not null" @@ -218,10 +218,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //world << "DEBUG: malf mode ticker test" if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/dead/observer/verb/reenter_corpse() set category = "Ghost" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 956453c4640..e58b3420c93 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -181,10 +181,7 @@ if (client.statpanel == "Status") stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/living/carbon/alien/Stun(amount) if(status_flags & CANSTUN) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 3fe57ec2acc..8e6da1eca78 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -83,12 +83,8 @@ I'm using this for Stat to give it a more nifty interface to work with ..() if(has_synthetic_assistance()) statpanel("Status") - stat(null, "Station Time: [worldtime2text()]") - - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_station_time() + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") //Knowing how well-off your mech is doing is really important as an MMI diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 132965764c4..93b57850974 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -32,9 +32,19 @@ else //Everyone else fails, skip the emote attempt return if("squish") + var/found_slime_bodypart = 0 + if(species.name == "Slime People") //Only Slime People can squish - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' + found_slime_bodypart = 1 + else + for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + on_CD = handle_emote_CD() + found_slime_bodypart = 1 + break + + if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt return if("scream", "fart", "flip", "snap") on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d82376c2f86..57c29c3d51d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -252,15 +252,13 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index ae11d2e8746..799226ea321 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -17,6 +17,9 @@ has_organ = list( "brain" = /obj/item/organ/brain/golem ) + suicide_messages = list( + "is crumbling into dust!", + "is smashing their body apart!") /datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) if(H.mind) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3727bd8de0a..635eb9ede3e 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -20,6 +20,11 @@ bodyflags = FEET_NOSLIP dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is staring into the closest light source!") /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) H.dust() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 82c7864dd46..7c813b4b1be 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -30,4 +30,9 @@ heat_level_1 = 999999999 heat_level_2 = 999999999 heat_level_3 = 999999999 - heat_level_3_breathe = 999999999 \ No newline at end of file + heat_level_3_breathe = 999999999 + + suicide_messages = list( + "is snapping their own bones!", + "is collapsing into a pile!", + "is twisting their skull off!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 20b1ecdfba3..cfb04c5427d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -88,6 +88,11 @@ //Death vars. var/death_message = "seizes up and falls limp, their eyes dead and lifeless..." + var/list/suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their thumbs into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index ff9ae6ff835..349b28b6efb 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -55,6 +55,12 @@ flesh_color = "#34AF10" reagent_tag = PROCESS_ORG base_color = "#066000" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/unathi/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -100,6 +106,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -135,6 +147,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#B43214" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -206,6 +224,13 @@ flesh_color = "#808D11" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is deeply inhaling oxygen!") /datum/species/vox/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -292,6 +317,13 @@ "eyes" = /obj/item/organ/eyes, "stack" = /obj/item/organ/stack/vox ) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is huffing oxygen!") /datum/species/kidan name = "Kidan" @@ -311,6 +343,12 @@ dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their antenna off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/slime name = "Slime People" @@ -333,6 +371,10 @@ has_organ = list( "brain" = /obj/item/organ/brain/slime ) + + suicide_messages = list( + "is melting into a puddle!", + "is turning a dull, brown color and melting into a puddle!") /datum/species/grey name = "Grey" @@ -433,6 +475,10 @@ "l_foot" = list("path" = /obj/item/organ/external/diona/foot), "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) ) + + suicide_messages = list( + "is losing branches!", + "is pulling themselves apart!") /datum/species/diona/can_understand(var/mob/other) var/mob/living/simple_animal/diona/D = other @@ -526,6 +572,12 @@ "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) ) + + suicide_messages = list( + "is powering down!", + "is smashing their own monitor!", + "is twisting their own neck!", + "is blocking their ventilation port!") /datum/species/machine/handle_death(var/mob/living/carbon/human/H) H.h_style = "" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 49488f529ac..8f078f18f90 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2,6 +2,13 @@ /mob/living/Destroy() ..() return QDEL_HINT_HARDDEL_NOW + +/mob/living/Stat() + . = ..() + if(. && get_rig_stats) + var/obj/item/weapon/rig/rig = get_rig() + if(rig) + SetupStat(rig) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 83f12db46dd..f1f5f7862b3 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -142,25 +142,11 @@ return 0 -// this function displays the station time in the status panel -/mob/living/silicon/proc/show_station_time() - stat(null, "Station Time: [worldtime2text()]") - - -// this function displays the shuttles ETA in the status panel if the shuttle has been called -/mob/living/silicon/proc/show_emergency_shuttle_eta() - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") - - - // This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms /mob/living/silicon/Stat() if(statpanel("Status")) - show_station_time() - show_emergency_shuttle_eta() + show_stat_station_time() + show_stat_emergency_shuttle_eta() show_system_integrity() show_malf_ai() ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index e91719c5915..6c4986541a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -258,7 +258,7 @@ if(spawnees & 128) C = new(src.loc) C.name = "Drone plasma overcharge counter" - C.origin_tech = "plasma=[rand(3,6)]" + C.origin_tech = "plasmatech=[rand(3,6)]" if(spawnees & 256) C = new(src.loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 623905c75e7..e1b2ce1477d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -990,6 +990,36 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs +// this function displays the station time in the status panel +/mob/proc/show_stat_station_time() + stat(null, "Station Time: [worldtime2text()]") + +// this function displays the shuttles ETA in the status panel if the shuttle has been called +/mob/proc/show_stat_emergency_shuttle_eta() + var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency + + if(E.mode >= SHUTTLE_RECALL) + var/message = "" + + var/timeleft = E.timeLeft() + message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + + switch(E.mode) + if(SHUTTLE_RECALL, SHUTTLE_ESCAPE) + message = "ETR-[message]" + if(SHUTTLE_CALL) + message = "ETA-[message]" + if(SHUTTLE_DOCKED) + if(timeleft < 5) + message = "Departing..." + else + message = "ETD-[message]" + if(SHUTTLE_STRANDED) + message = "ETA-ERR" + if(SHUTTLE_ENDGAME) + return + + stat(null, message) /mob/proc/add_stings_to_statpanel(var/list/stings) for(var/obj/effect/proc_holder/changeling/S in stings) diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index ae999cbcf03..bd5ba3ee0c8 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -30,21 +30,6 @@ return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() if(. != STATUS_INTERACTIVE) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index ee5b8ac050a..e2892ee3b89 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -36,7 +36,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly. + var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] + if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara"))) d*=5 M.dizziness += dizzy_adj. diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 1808e62ed11..260438fbed8 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -402,12 +402,14 @@ var/obj/machinery/door/Door = O spawn(-1) if(Door) - Door.close() if(istype(Door, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = Door + A.close(0,1) if(A.id_tag == "s_docking_airlock") A.lock() door_unlock_list += A + else + Door.close() else if (istype(AM,/mob)) var/mob/M = AM if(!M.move_on_shuttle) diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 9ccb4871aef..69847e0a6b6 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -69,8 +69,7 @@ BOMBCAP 20 ### ROUNDSTART SILICON LAWS ### ## This controls what the AI's laws are at the start of the round. -## Set to 0/commented for "off", silicons will just start with Asimov. -## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) -## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm. +## Set to 0/commented for "off", silicons will just start with Crewsimov. +## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm. -DEFAULT_LAWS 2 \ No newline at end of file +DEFAULT_LAWS 1 \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 866190c8971..56172c88974 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,34 @@ -->
+

31 January 2016

+

Crazylemon64 updated:

+ +

FalseIncarnate updated:

+ +

Fox McCloud updated:

+ +

Tastyfish updated:

+ +

pinatacolada updated:

+ +

29 January 2016

Crazylemon updated: