diff --git a/baystation12.dme b/baystation12.dme index 8afc68318e4..b82ce97a578 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -787,10 +787,10 @@ #include "code\modules\customitems\item_defines.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\destilery\main.dm" -#include "code\modules\detectivework\detective_work.dm" -#include "code\modules\detectivework\evidence.dm" -#include "code\modules\detectivework\footprints_and_rag.dm" -#include "code\modules\detectivework\scanner.dm" +#include "code\modules\DetectiveWork\detective_work.dm" +#include "code\modules\DetectiveWork\evidence.dm" +#include "code\modules\DetectiveWork\footprints_and_rag.dm" +#include "code\modules\DetectiveWork\scanner.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" diff --git a/code/WorkInProgress/carn/Explosion2.dm b/code/WorkInProgress/carn/Explosion2.dm index a1f2687cc85..06b85690024 100644 --- a/code/WorkInProgress/carn/Explosion2.dm +++ b/code/WorkInProgress/carn/Explosion2.dm @@ -9,7 +9,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa if(!epicenter) return if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - JMP)") log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) ) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d160e662e84..784ba44c188 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -490,7 +490,7 @@ its easier to just keep the beam vertical. var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblClickNew() proc is being tested) -/*/atom/proc/DblClickNew() +/atom/proc/DblClickNew() if(!usr) return // TODO DOOHL: Intergrate params to new proc. Saved for another time because var/valid_place is a fucking brainfuck @@ -792,7 +792,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl if (in_range) if ( !animal.restrained() ) - attack_animal(animal)*/ + attack_animal(animal) /atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE if(!usr) return @@ -943,9 +943,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl // ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN ------- - if (usr.last_click + usr.click_delay < world.time) - usr.last_click = world.time - usr.click_delay = 0 + if (usr.next_move < world.time) + usr.prev_move = usr.next_move + usr.next_move = world.time + 10 else // ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND ------- return @@ -1109,9 +1109,10 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl // ------- ITEM INACESSIBLE OR CLICKING ON SCREEN ------- if (istype(src, /obj/screen)) // ------- IT'S THE HUD YOU'RE CLICKING ON ------- - usr.delay_click(2) - if (usr.last_click + usr.click_delay < world.time) - usr.last_click = world.time + usr.prev_move = usr.next_move + usr:lastDblClick = world.time + 2 + if (usr.next_move < world.time) + usr.next_move = world.time + 2 else return @@ -1143,7 +1144,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl src.hand_al(usr, usr.hand) else // ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD ------- - if((LASER in usr:mutations) && usr:a_intent == "hurt" && usr.last_click + usr.click_delay < world.time) + if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move) // ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED ------- var/turf/T = get_turf(usr) @@ -1168,7 +1169,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl spawn( 1 ) A.process() - usr.delay_click(6) + usr.next_move = world.time + 6 return /atom/proc/ShiftClick(var/mob/M as mob) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 5a1e12a191b..0f1fd97b36f 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -102,9 +102,11 @@ var/global/vox_kills = 0 //Used to check the Inviolate. vox.age = rand(12,20) vox.dna.mutantrace = "vox" vox.set_species("Vox") + vox.languages = list() // Removing language from chargen. + vox.flavor_text = "" vox.add_language("Vox-pidgin") vox.h_style = "Short Vox Quills" - vox.flavor_text = "" + vox.f_style = "Shaved" for(var/datum/organ/external/limb in vox.organs) limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT) vox.equip_vox_raider() diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm index 1e8eb4e5368..730f69e6643 100644 --- a/code/game/machinery/podmen.dm +++ b/code/game/machinery/podmen.dm @@ -74,17 +74,16 @@ Growing it to term with nothing injected will grab a ghost from the observers. * ghost = source else // If no sample was injected or revival is not allowed, we grab an interested observer. for(var/mob/dead/observer/O in player_list) - if(O.client) - var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No") + if(O.client && O.client.prefs.be_special & BE_PLANT) + var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No", "Never for this round.") if(response == "Yes") candidates += O + else if(response == "Never for this round") + O.client.prefs.be_special ^= BE_PLANT if(!do_after(user, 100)) return - if(!src || !user) - return - if(candidates.len) ghost = pick(candidates) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 91ea8124393..cc4d766f25a 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -19,10 +19,10 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa epicenter = get_turf(epicenter) if(!epicenter) return - + playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) ) playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) ) - + var/close = range(world.view+round(devastation_range,1), epicenter) // to all distanced mobs play a different sound for(var/mob/M in world) if(M.z == epicenter.z) if(!(M in close)) @@ -30,7 +30,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space)) M << 'explosionfar.ogg' if(adminlog) - message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") + message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit @@ -85,4 +85,4 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in range(range, epicenter)) - tile.ex_act(2) + tile.ex_act(2) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 281c23f0fd0..c55684eb197 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -131,7 +131,8 @@ else if(isliving(src.loc)) return - user.delay_click(2) + user.lastDblClick = world.time + 2 + user.next_move = world.time + 2 src.pickup(user) add_fingerprint(user) user.put_in_active_hand(src) @@ -165,7 +166,8 @@ if(istype(src.loc, /mob/living)) return src.pickup(user) - user.delay_click(2) + user.lastDblClick = world.time + 2 + user.next_move = world.time + 2 user.put_in_active_hand(src) return @@ -227,8 +229,6 @@ log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" ) msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG - user.delay_click(10) - //spawn(1800) // this wont work right // M.lastattacker = null ///////////////////////// diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 6a26f70e1f5..77cf343de21 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -14,6 +14,7 @@ m_amt = 90 attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") var/max_water = 50 + var/last_use = 1.0 var/safety = 1 var/sprite_name = "fire_extinguisher" @@ -66,6 +67,11 @@ usr << "\red \The [src] is empty." return + if (world.time < src.last_use + 20) + return + + src.last_use = world.time + playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) var/direction = get_dir(src,target) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 38d07024feb..a6c3b2fede4 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -159,9 +159,14 @@ Implant Specifics:
"} return if(istype(imp_in, /mob/)) var/mob/T = imp_in + + message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") + log_game("Explosive implant triggered in [T] ([T.key]).") + T.gib() explosion(get_turf(imp_in), 1, 3, 4, 6, 3) var/turf/t = get_turf(imp_in) + if(t) t.hotspot_expose(3500,125) @@ -464,4 +469,4 @@ the implant may become unstable and either pre-maturely inject the subject or si /obj/item/weapon/implant/cortical name = "cortical stack" - desc = "A fist-sized mass of biocircuits and chips." + desc = "A fist-sized mass of biocircuits and chips." diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 48c51cdacff..c2514a11241 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -35,7 +35,6 @@ user.visible_message("[user] kicks [src].", \ "You kick [src].", \ "You hear twisting metal.") - user.delay_click(10) if(shock(user, 70)) return @@ -52,7 +51,6 @@ user.visible_message("[user] mangles [src].", \ "You mangle [src].", \ "You hear twisting metal.") - user.delay_click(10) if(!shock(user, 70)) health -= 5 @@ -66,7 +64,6 @@ user.visible_message("[user] smashes against [src].", \ "You smash against [src].", \ "You hear twisting metal.") - user.delay_click(10) health -= rand(2,3) healthcheck() @@ -79,7 +76,6 @@ M.visible_message("[M] smashes against [src].", \ "You smash against [src].", \ "You hear twisting metal.") - M.delay_click(10) health -= M.melee_damage_upper healthcheck() @@ -164,10 +160,8 @@ else if(istype(W, /obj/item/weapon/shard)) health -= W.force * 0.1 - user.delay_click(10) else if(!shock(user, 70)) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) - user.delay_click(10) switch(W.damtype) if("fire") health -= W.force diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 65fefec03c7..28791229725 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -104,19 +104,16 @@ new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) del(src) - usr.delay_click(10) else if (usr.a_intent == "hurt") playsound(src.loc, 'glassknock.ogg', 80, 1) usr.visible_message("\red [usr.name] bangs against the [src.name]!", \ "\red You bang against the [src.name]!", \ "You hear a banging sound.") - usr.delay_click(5) else playsound(src.loc, 'glassknock.ogg', 80, 1) usr.visible_message("[usr.name] knocks on the [src.name].", \ "You knock on the [src.name].", \ "You hear a knocking sound.") - usr.delay_click(5) return @@ -131,11 +128,9 @@ new /obj/item/weapon/shard(loc) if(reinf) new /obj/item/stack/rods(loc) del(src) - user.delay_click(10) else //for nicer text~ user.visible_message("[user] smashes into [src]!") playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1) - user.delay_click(10) /obj/structure/window/attack_alien(mob/user as mob) @@ -163,7 +158,6 @@ var/mob/living/M = G.affecting var/state = G.state del(W) //gotta delete it here because if window breaks, it won't get deleted - user.delay_click(10) switch (state) if(1) M.apply_damage(7) @@ -203,7 +197,6 @@ else if(W.damtype == BRUTE || W.damtype == BURN) hit(W.force) - user.delay_click(10) if(health <= 7) anchored = 0 update_nearby_icons() diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 44f1cfdd820..1b55ca6b039 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -470,12 +470,15 @@ dat += "" if(ticker.mode.raiders.len > 0) + dat += "
" for(var/datum/mind/raider in ticker.mode.raiders) var/mob/M = raider.current if(M) dat += "" dat += "" dat += "" + dat += "
Raiders
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PMShow Objective
" + /* if(ticker.mode.ninjas.len > 0) dat += "
" diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index dad75f8219a..1e328970fd8 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -62,7 +62,7 @@ */ /client/proc/fix_next_move() -/* set category = "Debug" + set category = "Debug" set name = "Unfreeze Everyone" var/largest_move_time = 0 var/largest_click_time = 0 @@ -90,7 +90,6 @@ message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1) message_admins("world.time = [world.time]", 1) feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - */ return /client/proc/radio_report() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 00c468ce7fe..71dbdcddffd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -16,6 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "infested monkey" = IS_MODE_COMPILED("monkey"), // 9 "ninja" = "true", // 10 "vox raider" = IS_MODE_COMPILED("heist"), // 11 + "diona" = 1, // 12 ) var/const/MAX_SAVE_SLOTS = 10 @@ -806,7 +807,7 @@ datum/preferences if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it! for(var/S in whitelisted_species) - if(is_alien_whitelisted(user,S)) + if(is_alien_whitelisted(user,S) || (S == "Unathi" && is_alien_whitelisted(user,"Soghun"))) new_species += S whitelisted = 1 if(!whitelisted) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f70d3956b03..8c41ec8c9a3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1030,6 +1030,7 @@ if (!O.amputated) O.status &= ~ORGAN_DESTROYED O.wounds.Cut() + O.heal_damage(1000,1000,1,1) var/datum/organ/external/head/h = organs_by_name["head"] h.disfigured = 0 @@ -1049,6 +1050,10 @@ for (var/datum/disease/virus in viruses) virus.cure() + for (var/ID in virus2) + var/datum/disease2/disease/V = virus2[ID] + V.cure(src) + ..() /mob/living/carbon/human/proc/is_lung_ruptured() @@ -1116,9 +1121,9 @@ mob/living/carbon/human/yank_out_object() set desc = "Remove an embedded item at the cost of bleeding and pain." set src in view(1) - if(!isliving(usr) || usr.last_click + usr.click_delay > world.time) + if(!isliving(usr) || usr.next_move > world.time) return - usr.delay_click(20) + usr.next_move = world.time + 20 if(usr.stat == 1) usr << "You are unconcious and cannot do that!" @@ -1353,4 +1358,4 @@ mob/living/carbon/human/yank_out_object() else src << "You do not have enough chemicals stored to reproduce." - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 0c6b8172a28..cb161b9d944 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -12,8 +12,6 @@ ..() - M.delay_click(10) - if((M != src) && check_shields(0, M.name)) visible_message("\red [M] attempted to touch [src]!") return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 245a372d2a0..162a69b49c7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -269,15 +269,6 @@ if(iscarbon(src)) var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - for(var/datum/organ/external/O in H.organs) - O.heal_damage(1000,1000,1,1) - for(var/datum/organ/internal/I in H.internal_organs) - I.damage = 0 - for (var/ID in H.virus2) - var/datum/disease2/disease/V = H.virus2[ID] - V.cure(src) for(var/datum/disease/D in viruses) D.cure(0) if(stat == 2) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 647f9318afa..4ea4a23553f 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -38,6 +38,7 @@ attacktext = "nips" friendly = "prods" wander = 0 + pass_flags = PASSTABLE var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin. var/mob/living/carbon/human/host // Human host for the brain worm. @@ -109,6 +110,21 @@ src << "You drop words into [host]'s mind: \"[message]\"" host << "Your own thoughts speak: \"[message]\"" +/mob/living/simple_animal/borer/Stat() + ..() + statpanel("Status") + + if(emergency_shuttle) + if(emergency_shuttle.online && emergency_shuttle.location < 2) + var/timeleft = emergency_shuttle.timeleft() + if (timeleft) + stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") + + if (client.statpanel == "Status") + stat("Chemicals", chemicals) + +// VERBS! + /mob/living/simple_animal/borer/proc/borer_speak(var/message) if(!message) return @@ -148,7 +164,31 @@ host.verbs += /mob/living/carbon/human/proc/punish_host host.verbs += /mob/living/carbon/human/proc/spawn_larvae -mob/living/simple_animal/borer/verb/release_host() +/mob/living/simple_animal/borer/verb/secrete_chemicals() + set category = "Alien" + set name = "Secrete Chemicals" + set desc = "Push some chemicals into your host's bloodstream." + + if(!host) + src << "You are not inside a host body." + return + + if(stat) + src << "You cannot secrete chemicals in your current state." + + if(chemicals < 50) + src << "You don't have enough chemicals!" + + var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine") + + if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check. + return + + src << "\red You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream." + host.reagents.add_reagent(chem, 15) + chemicals -= 50 + +/mob/living/simple_animal/borer/verb/release_host() set category = "Alien" set name = "Release Host" set desc = "Slither out of your host." @@ -269,4 +309,62 @@ mob/living/simple_animal/borer/proc/detatch() return else src << "They are no longer in range!" - return \ No newline at end of file + return + +/mob/living/simple_animal/borer/verb/ventcrawl() + set name = "Crawl through Vent" + set desc = "Enter an air vent and crawl through the pipe system." + set category = "Alien" + +// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) +// return + var/obj/machinery/atmospherics/unary/vent_pump/vent_found + var/welded = 0 + for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) + if(!v.welded) + vent_found = v + break + else + welded = 1 + if(vent_found) + if(vent_found.network&&vent_found.network.normal_members.len) + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) + if(temp_vent.loc == loc) + continue + vents.Add(temp_vent) + var/list/choices = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents) + if(vent.loc.z != loc.z) + continue + var/atom/a = get_turf(vent) + choices.Add(a.loc) + var/turf/startloc = loc + var/obj/selection = input("Select a destination.", "Duct System") in choices + var/selection_position = choices.Find(selection) + if(loc==startloc) + var/obj/target_vent = vents[selection_position] + if(target_vent) + loc = target_vent.loc + else + src << "\blue You need to remain still while entering a vent." + else + src << "\blue This vent is not connected to anything." + else if(welded) + src << "\red That vent is welded." + else + src << "\blue You must be standing on or beside an air vent to enter it." + return + +//copy paste from alien/larva, if that func is updated please update this one alsoghost +/mob/living/simple_animal/borer/verb/hide() + set name = "Hide" + set desc = "Allows to hide beneath tables or certain items. Toggled on or off." + set category = "Alien" + + if (layer != TURF_LAYER+0.2) + layer = TURF_LAYER+0.2 + src << text("\blue You are now hiding.") + else + layer = MOB_LAYER + src << text("\blue You have stopped hiding.") \ No newline at end of file diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index be1fb566b7a..1c3498802d1 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -33,7 +33,7 @@ if(hud_used) del(hud_used) //remove the hud objects hud_used = new /datum/hud(src) - last_click = world.time + next_move = 1 sight |= SEE_SELF ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3600b8b0f7b..08aad3d7ad6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -905,9 +905,9 @@ mob/verb/yank_out_object() set desc = "Remove an embedded item at the cost of bleeding and pain." set src in view(1) - if(!isliving(usr) || usr.last_click + usr.click_delay > world.time) + if(!isliving(usr) || usr.next_move > world.time) return - usr.delay_click(20) + usr.next_move = world.time + 20 if(usr.stat == 1) usr << "You are unconcious and cannot do that!" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6cbd091c0c1..b82f6736bbe 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -54,8 +54,8 @@ var/sdisabilities = 0 //Carbon var/disabilities = 0 //Carbon var/atom/movable/pulling = null - var/last_click = null - var/click_delay = 0 + var/next_move = null + var/prev_move = null var/monkeyizing = null //Carbon var/other = 0.0 var/hand = null diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 07a07500083..5363c05a116 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -128,7 +128,7 @@ return if(killing) return - if (assailant.last_click + assailant.click_delay > world.time) + if (assailant.next_move > world.time) return if ((!( assailant.canmove ) || assailant.lying)) //SN src = null @@ -140,7 +140,7 @@ if (!( killing )) assailant.visible_message("\red [assailant] has temporarily tightened \his grip on [affecting]!") //Foreach goto(97) - assailant.delay_click(10) + assailant.next_move = world.time + 10 //affecting.stunned = max(2, affecting.stunned) //affecting.paralysis = max(1, affecting.paralysis) affecting.losebreath = min(affecting.losebreath + 1, 3) @@ -162,8 +162,6 @@ if(killing) return - assailant.delay_click(10) - switch(S.id) if(1.0) if (state < 2) @@ -237,7 +235,7 @@ assailant.attack_log += text("\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])") log_attack("[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])") - assailant.delay_click(10) + assailant.next_move = world.time + 10 affecting.losebreath += 1 else assailant.visible_message("\red [assailant] was unable to tighten \his grip on [affecting]'s neck!") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 981d03962e7..29b2bfeac3c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -454,7 +454,3 @@ var/list/intents = list("help","disarm","grab","hurt") hud_used.action_intent.icon_state = "harm" else hud_used.action_intent.icon_state = "help" - -/mob/proc/delay_click(var/delay) - src.click_delay = max(src.click_delay, delay) - return src.click_delay diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index e74e2558628..6e6463fce45 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -351,7 +351,7 @@ if(client.prefs.species) chosen_species = all_species[client.prefs.species] if(chosen_species) - if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED)) + if(is_alien_whitelisted(src, client.prefs.species) || (client.prefs.species == "Unathi" && is_alien_whitelisted(src, "Soghun")) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED)) new_character.set_species(client.prefs.species) if(chosen_species.language) new_character.add_language(chosen_species.language) diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm index 441a0d961fe..5742b95cb2d 100644 --- a/code/modules/mob/screen.dm +++ b/code/modules/mob/screen.dm @@ -600,9 +600,9 @@ set name = "Resist" set category = "IC" - if(!isliving(usr) || usr.last_click + usr.click_delay > world.time) + if(!isliving(usr) || usr.next_move > world.time) return - usr.delay_click(20) + usr.next_move = world.time + 20 var/mob/living/L = usr @@ -670,7 +670,7 @@ if(iscarbon(L)) var/mob/living/carbon/C = L if( C.handcuffed ) - C.delay_click(100) + C.next_move = world.time + 100 C.last_special = world.time + 100 C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" for(var/mob/O in viewers(L)) @@ -704,7 +704,7 @@ // breakout_time++ //Harder to get out of welded lockers than locked lockers //okay, so the closet is either welded or locked... resist!!! - usr.delay_click(100) + usr.next_move = world.time + 100 L.last_special = world.time + 100 L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)" for(var/mob/O in viewers(usr.loc)) @@ -757,7 +757,7 @@ else if(iscarbon(L)) var/mob/living/carbon/CM = L if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.delay_click(100) + CM.next_move = world.time + 100 CM.last_special = world.time + 100 if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)" @@ -795,7 +795,7 @@ CM.handcuffed = null CM.update_inv_handcuffed() else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.delay_click(100) + CM.next_move = world.time + 100 CM.last_special = world.time + 100 if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here. usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7eabd7e59c2..35af50877cb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -131,7 +131,7 @@ in_chamber.loc = get_turf(user) in_chamber.starting = get_turf(user) in_chamber.shot_from = src - usr.delay_click(4) + user.next_move = world.time + 4 in_chamber.silenced = silenced in_chamber.current = curloc in_chamber.yo = targloc.y - curloc.y diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index a70ba4ab8ea..0b4a3c1e7e9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -68,7 +68,7 @@ /obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob) ..() - if(reagents.total_volume <= 0) + if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled. flags &= ~OPENCONTAINER update_icon() return @@ -84,6 +84,4 @@ if(reagents && reagents.reagent_list.len) usr << "\blue It is currently loaded." else - usr << "\blue It is spent." - - + usr << "\blue It is spent." \ No newline at end of file diff --git a/code/setup.dm b/code/setup.dm index 83a4ae01619..7395595cee5 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -641,6 +641,7 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define BE_MONKEY 512 #define BE_NINJA 1024 #define BE_RAIDER 2048 +#define BE_PLANT 4096 var/list/be_special_flags = list( "Traitor" = BE_TRAITOR, @@ -654,7 +655,8 @@ var/list/be_special_flags = list( "Cultist" = BE_CULTIST, "Monkey" = BE_MONKEY, "Ninja" = BE_NINJA, - "Raider" = BE_RAIDER + "Raider" = BE_RAIDER, + "Diona" = BE_PLANT ) #define AGE_MIN 17 //youngest a character can be @@ -720,4 +722,4 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse //Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. -#define RESTRICTED 2 // Language can only be accquired by spawning or an admin. \ No newline at end of file +#define RESTRICTED 2 // Language can only be accquired by spawning or an admin. diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index c6bf1e373e2..169f3c49f16 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index ec08cf37e78..253cf851a83 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/maps/RandomZLevels/fileList.txt b/maps/RandomZLevels/fileList.txt index 10fbb9562ff..007837dc532 100644 --- a/maps/RandomZLevels/fileList.txt +++ b/maps/RandomZLevels/fileList.txt @@ -2,3 +2,5 @@ #Maps must be the full path to them #Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior. #SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START + +#maps/RandomZLevels/awaymission.dmm diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm index 8b8b458a7f0..46c011d459d 100644 --- a/maps/tgstation.2.1.0.0.1.dmm +++ b/maps/tgstation.2.1.0.0.1.dmm @@ -2288,7 +2288,7 @@ "aRZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "aSa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "aSb" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) -"aSc" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) +"aSc" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aSd" = (/obj/machinery/vending/dinnerware,/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Kitchen"; dir = 2},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen) "aSe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen) "aSf" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
Ninjas