diff --git a/baystation12.dme b/baystation12.dme index f6683c342f6..06fe933f756 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1063,6 +1063,7 @@ #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\carbon_powers.dm" #include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 6f75f4ea295..e655295f783 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -50,7 +50,7 @@ atom/proc/c_airblock(turf/other) #ifdef ZASDBG ASSERT(isturf(other)) #endif - return !CanPass(null, other, 0, 0) + 2*!CanPass(null, other, 1.5, 1) + return (AIR_BLOCKED*!CanPass(null, other, 0, 0))|(ZONE_BLOCKED*!CanPass(null, other, 1.5, 1)) turf/c_airblock(turf/other) diff --git a/code/ZAS/Controller.dm b/code/ZAS/Controller.dm index 4ba30f47b36..d8cb87a7407 100644 --- a/code/ZAS/Controller.dm +++ b/code/ZAS/Controller.dm @@ -154,7 +154,18 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG var/updated = 0 #endif + + //defer updating of self-zone-blocked turfs until after all other turfs have been updated. + //this hopefully ensures that non-self-zone-blocked turfs adjacent to self-zone-blocked ones + //have valid zones when the self-zone-blocked turfs update. + var/list/deferred = list() + for(var/turf/T in updating) + //check if the turf is self-zone-blocked + if(T.c_airblock(T) & ZONE_BLOCKED) + deferred += T + continue + T.update_air_properties() T.post_update_air_properties() T.needs_air_update = 0 @@ -164,6 +175,15 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #endif //sleep(1) + for(var/turf/T in deferred) + T.update_air_properties() + T.post_update_air_properties() + T.needs_air_update = 0 + #ifdef ZASDBG + T.overlays -= mark + updated++ + #endif + #ifdef ZASDBG if(updated != updating.len) tick_progress = "[updating.len - updated] tiles left unupdated." @@ -307,7 +327,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_sleeping(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(E.sleeping) return active_edges.Remove(E) @@ -315,7 +335,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun /datum/controller/air_system/proc/mark_edge_active(connection_edge/E) #ifdef ZASDBG - ASSERT(istype(E) + ASSERT(istype(E)) #endif if(!E.sleeping) return active_edges.Add(E) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index 9d031ce3d39..ab7360643fe 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -46,6 +46,7 @@ air_master.connect(sim, src) /turf/simulated/update_air_properties() + if(zone && zone.invalid) c_copy_air() zone = null //Easier than iterating through the list at the zone. @@ -58,7 +59,8 @@ #endif if(zone) var/zone/z = zone - if(locate(/obj/machinery/door/airlock) in src) //Hacky, but prevents normal airlocks from rebuilding zones all the time + + if(s_block & ZONE_BLOCKED) //Hacky, but prevents normal airlocks from rebuilding zones all the time z.remove(src) else z.rebuild() @@ -120,8 +122,10 @@ //Might have assigned a zone, since this happens for each direction. if(!zone) - //if((block & ZONE_BLOCKED) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) - if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || (r_block & ZONE_BLOCKED && !(s_block & ZONE_BLOCKED))) + //We do not merge if + // they are blocking us and we are not blocking them, or if + // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. + if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG if(verbose) world << "[d] is zone blocked." //dbg(zone_blocked, d) diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index 7c9c5f32ed2..7bb8afc8c5e 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -105,6 +105,13 @@ Class Procs: #ifdef ZASDBG T.dbg(merged) #endif + + //rebuild the old zone's edges so that the will be possesed by the new zone + for(var/connection_edge/E in edges) + if(E.contains_zone(into)) + continue //don't need to rebuild this edge + for(var/turf/T in E.connecting_turfs) + air_master.mark_for_update(T) /zone/proc/c_invalidate() invalid = 1 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c65698933c0..564910d3df2 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -922,30 +922,6 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl refined_trg -= B continue moving - var/list/doors = new/list() - - if(toupdate.len) - for(var/turf/simulated/T1 in toupdate) - for(var/obj/machinery/door/D2 in T1) - doors += D2 - /*if(T1.parent) - air_master.groups_to_rebuild += T1.parent - else - air_master.tiles_to_update += T1*/ - - if(fromupdate.len) - for(var/turf/simulated/T2 in fromupdate) - for(var/obj/machinery/door/D2 in T2) - doors += D2 - /*if(T2.parent) - air_master.groups_to_rebuild += T2.parent - else - air_master.tiles_to_update += T2*/ - - for(var/obj/O in doors) - O:update_nearby_tiles(1) - - proc/DuplicateObject(obj/original, var/perfectcopy = 0 , var/sameloc = 0) if(!original) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e9c5429dd2a..22253450b75 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -259,11 +259,11 @@ datum/hud/New(mob/owner) if(!hud_used) usr << "\red This mob type does not use a HUD." return - + if(!ishuman(src)) usr << "\red Inventory hiding is currently only supported for human mobs, sorry." return - + if(!client) return if(client.view != world.view) return @@ -325,7 +325,7 @@ datum/hud/New(mob/owner) return if(client.view != world.view) return - + if(hud_used.hud_shown) hud_used.hud_shown = 0 if(src.hud_used.adding) @@ -337,6 +337,7 @@ datum/hud/New(mob/owner) if(src.hud_used.item_action_list) src.client.screen -= src.hud_used.item_action_list src.client.screen -= src.internals + src.client.screen += src.hud_used.action_intent //we want the intent swticher visible else hud_used.hud_shown = 1 if(src.hud_used.adding) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index ad624aec9b5..49b4b4ac985 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -432,7 +432,7 @@ var/global/datum/controller/gameticker/ticker robo.laws.show_laws(world) if(dronecount) - world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." + world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] at the end of this round." mode.declare_completion()//To declare normal completion. diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index a02553cc77e..683e6e12202 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -11,7 +11,7 @@ var/obj/item/weapon/cell/charging = null var/chargelevel = -1 -/obj/machinery/cell_charger/proc/updateicon() +/obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" if(charging && !(stat & (BROKEN|NOPOWER)) ) @@ -57,7 +57,7 @@ charging = W user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") chargelevel = -1 - updateicon() + update_icon() else if(istype(W, /obj/item/weapon/wrench)) if(charging) user << "\red Remove the cell first!" @@ -76,7 +76,7 @@ src.charging = null user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 - updateicon() + update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough @@ -108,6 +108,6 @@ charging.give(active_power_usage*CELLRATE) update_use_power(2) - updateicon() + update_icon() else update_use_power(1) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 130d8d89c81..b124c4c2263 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -440,7 +440,7 @@ last_fired = world.time else if (world.time % 3) - occupant_message("[src] is not ready to fire again!") + occupant_message("[src] is not ready to fire again!") return 0 switch(mode) diff --git a/code/game/objects/effects/chemsmoke.dm b/code/game/objects/effects/chemsmoke.dm index e64a84c47c3..357996351d6 100644 --- a/code/game/objects/effects/chemsmoke.dm +++ b/code/game/objects/effects/chemsmoke.dm @@ -229,6 +229,10 @@ // Fades out the smoke smoothly using it's alpha variable. //------------------------------------------ /datum/effect/effect/system/smoke_spread/chem/proc/fadeOut(var/atom/A, var/frames = 16) + if(A.alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". var/step = A.alpha / frames for(var/i = 0, i < frames, i++) A.alpha -= step diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 682347669a7..60e3f1b44f0 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -22,9 +22,9 @@ /obj/effect/spider/attackby(var/obj/item/weapon/W, var/mob/user) if(W.attack_verb.len) - visible_message("\red \The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been [pick(W.attack_verb)] with \the [W][(user ? " by [user]." : ".")]") else - visible_message("\red \The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") + visible_message("\The [src] have been attacked with \the [W][(user ? " by [user]." : ".")]") var/damage = W.force / 4.0 diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index 593e85efdd3..03f060f1551 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -1,18 +1,24 @@ /obj/item/weapon/flame/candle name = "red candle" - desc = "a candle" + desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments." icon = 'icons/obj/candle.dmi' icon_state = "candle1" item_state = "candle1" w_class = 1 - var/wax = 200 + var/wax = 0 + var/starting_wax = 0 + +/obj/item/weapon/flame/candle/New() + wax = rand(800, 1000) // Enough for 27-33 minutes. 30 minutes on average. + starting_wax = wax + ..() /obj/item/weapon/flame/candle/update_icon() var/i - if(wax>150) + if(wax > starting_wax*3/4) i = 1 - else if(wax>80) + else if(wax > starting_wax*2/5) i = 2 else i = 3 icon_state = "candle[i][lit ? "_lit" : ""]" @@ -80,4 +86,4 @@ /obj/item/weapon/flame/candle/dropped(mob/user) if(lit) user.SetLuminosity(user.luminosity - CANDLE_LUM) - SetLuminosity(CANDLE_LUM) + SetLuminosity(CANDLE_LUM) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 304c59fb982..7b2c03ba4a3 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -131,6 +131,7 @@ /obj/item/weapon/storage/firstaid/surgery name = "surgery kit" desc = "Contains tools for surgery." + storage_slots = 10 /obj/item/weapon/storage/firstaid/surgery/New() ..() @@ -142,6 +143,9 @@ new /obj/item/weapon/retractor(src) new /obj/item/weapon/scalpel(src) new /obj/item/weapon/surgicaldrill(src) + new /obj/item/weapon/bonegel(src) + new /obj/item/weapon/FixOVein(src) + new /obj/item/stack/medical/advanced/bruise_pack(src) return /* diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 40163e7c780..8b46abee496 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -10,7 +10,7 @@ var/welded = 0 var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 - var/lastbang + var/breakout = 0 //if someone is currently breaking out. mutex var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate //then open it in a populated area to crash clients. var/open_sound = 'sound/machines/click.ogg' @@ -255,12 +255,6 @@ if(!src.open()) user << "It won't budge!" - if(!lastbang) - lastbang = 1 - for (var/mob/M in hearers(src, null)) - M << text("BANG, bang!", max(0, 5 - get_dist(src, M))) - spawn(30) - lastbang = 0 /obj/structure/closet/attack_hand(mob/user as mob) src.add_fingerprint(user) @@ -308,3 +302,64 @@ dump_contents() spawn(1) del(src) return 1 + +/obj/structure/closet/proc/req_breakout() + if(breakout) + return 0 //Already breaking out. + if(opened) + return 0 //Door's open... wait, why are you in it's contents then? + if(!welded) + return 0 //closed but not welded... + return 1 + +/obj/structure/closet/proc/mob_breakout(var/mob/living/escapee) + var/breakout_time = 2 //2 minutes by default + + if(!req_breakout()) + return + + //okay, so the closet is either welded or locked... resist!!! + escapee.next_move = world.time + 100 + escapee.last_special = world.time + 100 + escapee << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" + + visible_message("The [src] begins to shake violently!") + + breakout = 1 //can't think of a better way to do this right now. + for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + animate_shake() + + if(!do_after(escapee, 50)) //5 seconds + breakout = 0 + return + if(!escapee || escapee.stat || escapee.loc != src) + breakout = 0 + return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened + //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... + if(!req_breakout()) + breakout = 0 + return + + //Well then break it! + breakout = 0 + escapee << "You successfully break out!" + visible_message("\the [escapee] successfully broke out of \the [src]!") + playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) + break_open() + animate_shake() + +/obj/structure/closet/proc/break_open() + welded = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() + +/obj/structure/closet/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index a3b9f399281..df2985c42ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -132,3 +132,25 @@ overlays += "welded" else icon_state = icon_opened + + +/obj/structure/closet/secure_closet/req_breakout() + if(!opened && locked) return 1 + return ..() //It's a secure closet, but isn't locked. + +/obj/structure/closet/secure_closet/break_open() + desc += " It appears to be broken." + icon_state = icon_off + spawn() + flick(icon_broken, src) + sleep(10) + flick(icon_broken, src) + sleep(10) + broken = 1 + locked = 0 + update_icon() + //Do this to prevent contents from being opened into nullspace (read: bluespace) + if(istype(loc, /obj/structure/bigDelivery)) + var/obj/structure/bigDelivery/BD = loc + BD.unwrap() + open() \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 29f425d4a3a..5e8e5747c0a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -227,12 +227,6 @@ if(S.zone) S.zone.rebuild() if(ispath(N, /turf/simulated/floor)) - //if the old turf had a zone, connect the new turf to it as well - Cael - //Adjusted by SkyMarshal 5/10/13 - The air master will handle the addition of the new turf. - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) //W.Assimilate_Air() @@ -249,7 +243,7 @@ W.RemoveLattice() if(air_master) - air_master.mark_for_update(src) + air_master.mark_for_update(src) //handle the addition of the new turf. for(var/turf/space/S in range(W,1)) S.update_starlight() @@ -258,10 +252,6 @@ return W else - //if(zone) - // zone.RemoveTurf(src) - // if(!zone.CheckStatus()) - // zone.SetStatus(ZONE_ACTIVE) var/turf/W = new N( locate(src.x, src.y, src.z) ) W.lighting_lumcount += old_lumcount diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index e21de8641d7..a643b370fc4 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,12 +1,17 @@ /client/proc/cinematic(var/cinematic as anything in list("explosion",null)) - set name = "cinematic" + set name = "Cinematic" set category = "Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. - set hidden = 1 + + if(!check_rights(R_FUN)) + return + if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return if(!ticker) return switch(cinematic) if("explosion") + if(alert("The game will be over. Are you really sure?", "Confirmation" ,"Continue", "Cancel") == "Cancel") + return var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num var/override switch(parameter) @@ -15,4 +20,8 @@ if(0) override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","mercenary","AI malfunction","no override") ticker.station_explosion_cinematic(parameter,override) + + log_admin("[key_name(src)] launched cinematic \"[cinematic]\"") + message_admins("[key_name_admin(src)] launched cinematic \"[cinematic]\"", 1) + return \ No newline at end of file diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index dae2c09cbd2..03a1104905e 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -31,7 +31,7 @@ var/global/list/gear_datums = list() /datum/gear var/display_name //Name/index. Must be unique. var/path //Path to item. - var/cost //Number of points used. + var/cost //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points. var/slot //Slot to equip to. var/list/allowed_roles //Roles that can spawn with this item. var/whitelisted //Term to check the whitelist for.. @@ -48,19 +48,19 @@ var/global/list/gear_datums = list() /datum/gear/gbandana display_name = "bandana, green" path = /obj/item/clothing/head/greenbandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/obandana display_name = "bandana, orange" path = /obj/item/clothing/head/orangebandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bandana display_name = "bandana, pirate-red" path = /obj/item/clothing/head/bandana - cost = 2 + cost = 1 slot = slot_head /datum/gear/bsec_beret @@ -73,20 +73,20 @@ var/global/list/gear_datums = list() /datum/gear/eng_beret display_name = "beret, engie-orange" path = /obj/item/clothing/head/beret/eng - cost = 2 + cost = 1 slot = slot_head // allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/purp_beret display_name = "beret, purple" path = /obj/item/clothing/head/beret/jan - cost = 2 + cost = 1 slot = slot_head /datum/gear/red_beret display_name = "beret, red" path = /obj/item/clothing/head/beret - cost = 2 + cost = 1 slot = slot_head /datum/gear/sec_beret @@ -99,74 +99,80 @@ var/global/list/gear_datums = list() /datum/gear/bcap display_name = "cap, blue" path = /obj/item/clothing/head/soft/blue - cost = 2 + cost = 1 slot = slot_head /datum/gear/mailman display_name = "cap, blue station" path = /obj/item/clothing/head/mailman - cost = 2 + cost = 1 slot = slot_head /datum/gear/flatcap display_name = "cap, brown-flat" path = /obj/item/clothing/head/flatcap - cost = 2 + cost = 1 slot = slot_head /datum/gear/corpcap display_name = "cap, corporate (Security)" path = /obj/item/clothing/head/soft/sec/corp - cost = 2 + cost = 1 slot = slot_head allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/gcap display_name = "cap, green" path = /obj/item/clothing/head/soft/green - cost = 2 + cost = 1 slot = slot_head /datum/gear/grcap display_name = "cap, grey" path = /obj/item/clothing/head/soft/grey - cost = 2 + cost = 1 slot = slot_head /datum/gear/ocap display_name = "cap, orange" path = /obj/item/clothing/head/soft/orange - cost = 2 + cost = 1 slot = slot_head /datum/gear/purcap display_name = "cap, purple" path = /obj/item/clothing/head/soft/purple - cost = 2 + cost = 1 slot = slot_head /datum/gear/raincap display_name = "cap, rainbow" path = /obj/item/clothing/head/soft/rainbow - cost = 3 + cost = 1 slot = slot_head /datum/gear/rcap display_name = "cap, red" path = /obj/item/clothing/head/soft/red - cost = 2 + cost = 1 slot = slot_head /datum/gear/ycap display_name = "cap, yellow" path = /obj/item/clothing/head/soft/yellow - cost = 2 + cost = 1 + slot = slot_head + +/datum/gear/wcap + display_name = "cap, white" + path = /obj/item/clothing/head/soft/mime + cost = 1 slot = slot_head /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower - cost = 2 + cost = 1 slot = slot_head /datum/gear/dbhardhat @@ -181,6 +187,12 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_head +/datum/gear/rhardhat + display_name = "hardhat, red" + path = /obj/item/clothing/head/hardhat/red + cost = 2 + slot = slot_head + /datum/gear/yhardhat display_name = "hardhat, yellow" path = /obj/item/clothing/head/hardhat @@ -190,32 +202,38 @@ var/global/list/gear_datums = list() /datum/gear/boater display_name = "hat, boatsman" path = /obj/item/clothing/head/boaterhat - cost = 2 + cost = 1 slot = slot_head /datum/gear/bowler display_name = "hat, bowler" path = /obj/item/clothing/head/bowler - cost = 2 + cost = 1 slot = slot_head /datum/gear/fez display_name = "hat, fez" path = /obj/item/clothing/head/fez - cost = 2 + cost = 1 + slot = slot_head + +/datum/gear/tophat + display_name = "hat, tophat" + path = /obj/item/clothing/head/that + cost = 1 slot = slot_head // Wig by Earthcrusher, blame him. /datum/gear/philosopher_wig display_name = "natural philosopher's wig" path = /obj/item/clothing/head/philosopher_wig - cost = 3 + cost = 1 slot = slot_head /datum/gear/ushanka display_name = "ushanka" path = /obj/item/clothing/head/ushanka - cost = 2 + cost = 1 slot = slot_head // This was sprited and coded specifically for Zhan-Khazan characters. Before you @@ -223,7 +241,7 @@ var/global/list/gear_datums = list() /datum/gear/zhan_scarf display_name = "Zhan headscarf" path = /obj/item/clothing/head/tajaran/scarf - cost = 2 + cost = 1 slot = slot_head whitelisted = "Tajara" @@ -239,12 +257,37 @@ var/global/list/gear_datums = list() display_name = "Glasses, green" path = /obj/item/clothing/glasses/gglasses cost = 1 + slot = slot_glasses + +/datum/gear/prescriptionhipster + display_name = "Glasses, hipster" + path = /obj/item/clothing/glasses/regular/hipster + cost = 1 + slot = slot_glasses + +/datum/gear/prescription + display_name = "Glasses, prescription" + path = /obj/item/clothing/glasses/regular + cost = 1 + slot = slot_glasses + +/datum/gear/monocle + display_name = "Monocle" + path = /obj/item/clothing/glasses/monocle + cost = 1 + slot = slot_glasses /datum/gear/scanning_goggles display_name = "scanning goggles" path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 cost = 1 -// allowed_roles = list("Roboticist", "Scientist", "Research Director") + slot = slot_glasses + +/datum/gear/sciencegoggles + display_name = "Science Goggles" + path = /obj/item/clothing/glasses/science + cost = 1 + slot = slot_glasses /datum/gear/security display_name = "Security HUD" @@ -260,10 +303,10 @@ var/global/list/gear_datums = list() slot = slot_glasses allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/prescription +/datum/gear/prescriptionsun display_name = "sunglasses, presciption" path = /obj/item/clothing/glasses/sunglasses/prescription - cost = 3 + cost = 2 slot = slot_glasses // Mask @@ -276,71 +319,184 @@ var/global/list/gear_datums = list() // Uniform slot -/datum/gear/exec_suit - display_name = "executive suit" - path = /obj/item/clothing/under/suit_jacket/really_black - slot = slot_w_uniform - cost = 2 - /datum/gear/blazer_blue display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform - cost = 2 - -/datum/gear/kilt - display_name = "kilt" - path = /obj/item/clothing/under/kilt - slot = slot_w_uniform - cost = 3 - -/datum/gear/blackjumpskirt - display_name = "jumpskirt, black" - path = /obj/item/clothing/under/blackjumpskirt - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_blue - display_name = "plaid skirt, blue" - path = /obj/item/clothing/under/dress/plaid_blue - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_purple - display_name = "plaid skirt, purple" - path = /obj/item/clothing/under/dress/plaid_purple - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_red - display_name = "plaid skirt, red" - path = /obj/item/clothing/under/dress/plaid_red - slot = slot_w_uniform - cost = 2 - -/datum/gear/skirt_black - display_name = "skirt, black" - path = /obj/item/clothing/under/blackskirt - slot = slot_w_uniform - cost = 2 - -/datum/gear/sundress - display_name = "sundress" - path = /obj/item/clothing/under/sundress - slot = slot_w_uniform - cost = 3 - -/datum/gear/sundress_white - display_name = "sundress, white" - path = /obj/item/clothing/under/sundress_white - slot = slot_w_uniform - cost = 3 + cost = 1 /datum/gear/cheongsam display_name = "cheongsam, white" path = /obj/item/clothing/under/cheongsam slot = slot_w_uniform - cost = 3 + cost = 1 + +/datum/gear/kilt + display_name = "kilt" + path = /obj/item/clothing/under/kilt + slot = slot_w_uniform + cost = 1 + +/datum/gear/blackjumpskirt + display_name = "jumpskirt, black" + path = /obj/item/clothing/under/blackjumpskirt + slot = slot_w_uniform + cost = 1 + +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, female-black" + path = /obj/item/clothing/under/color/blackf + slot = slot_w_uniform + cost = 1 +/datum/gear/blackfjumpsuit + display_name = "jumpsuit, rainbow" + path = /obj/item/clothing/under/rainbow + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_blue + display_name = "plaid skirt, blue" + path = /obj/item/clothing/under/dress/plaid_blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_purple + display_name = "plaid skirt, purple" + path = /obj/item/clothing/under/dress/plaid_purple + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_red + display_name = "plaid skirt, red" + path = /obj/item/clothing/under/dress/plaid_red + slot = slot_w_uniform + cost = 1 + +/datum/gear/skirt_black + display_name = "skirt, black" + path = /obj/item/clothing/under/blackskirt + slot = slot_w_uniform + cost = 1 + +/datum/gear/amishsuit + display_name = "suit, amish" + path = /obj/item/clothing/under/sl_suit + slot = slot_w_uniform + cost = 1 + +/datum/gear/blacksuit + display_name = "suit, black" + path = /obj/item/clothing/under/suit_jacket + slot = slot_w_uniform + cost = 1 + +/datum/gear/shinyblacksuit + display_name = "suit, shiny-black" + path = /obj/item/clothing/under/lawyer/black + slot = slot_w_uniform + cost = 1 + +/datum/gear/bluesuit + display_name = "suit, blue" + path = /obj/item/clothing/under/lawyer/blue + slot = slot_w_uniform + cost = 1 + +/datum/gear/burgundysuit + display_name = "suit, burgundy" + path = /obj/item/clothing/under/suit_jacket/burgundy + slot = slot_w_uniform + cost = 1 + +/datum/gear/checkeredsuit + display_name = "suit, checkered" + path = /obj/item/clothing/under/suit_jacket/checkered + slot = slot_w_uniform + cost = 1 + +/datum/gear/charcoalsuit + display_name = "suit, charcoal" + path = /obj/item/clothing/under/suit_jacket/charcoal + slot = slot_w_uniform + cost = 1 + +/datum/gear/execsuit + display_name = "suit, executive" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 1 + +/datum/gear/femaleexecsuit + display_name = "suit, female-executive" + path = /obj/item/clothing/under/suit_jacket/female + slot = slot_w_uniform + cost = 1 + +/datum/gear/gentlesuit + display_name = "suit, gentlemen" + path = /obj/item/clothing/under/gentlesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/navysuit + display_name = "suit, navy" + path = /obj/item/clothing/under/suit_jacket/navy + slot = slot_w_uniform + cost = 1 + +/datum/gear/redsuit + display_name = "suit, red" + path = /obj/item/clothing/under/suit_jacket/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/redlawyer + display_name = "suit, lawyer-red" + path = /obj/item/clothing/under/lawyer/red + slot = slot_w_uniform + cost = 1 + +/datum/gear/oldmansuit + display_name = "suit, old-man" + path = /obj/item/clothing/under/lawyer/oldman + slot = slot_w_uniform + cost = 1 + +/datum/gear/purplesuit + display_name = "suit, purple" + path = /obj/item/clothing/under/lawyer/purpsuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/tansuit + display_name = "suit, tan" + path = /obj/item/clothing/under/suit_jacket/tan + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitesuit + display_name = "suit, white" + path = /obj/item/clothing/under/scratch + slot = slot_w_uniform + cost = 1 + +/datum/gear/whitebluesuit + display_name = "suit, white-blue" + path = /obj/item/clothing/under/lawyer/bluesuit + slot = slot_w_uniform + cost = 1 + +/datum/gear/sundress + display_name = "sundress" + path = /obj/item/clothing/under/sundress + slot = slot_w_uniform + cost = 1 + +/datum/gear/sundress_white + display_name = "sundress, white" + path = /obj/item/clothing/under/sundress_white + slot = slot_w_uniform + cost = 1 /datum/gear/uniform_captain display_name = "uniform, captain's dress" @@ -352,7 +508,7 @@ var/global/list/gear_datums = list() /datum/gear/corpsecsuit display_name = "uniform, corporate (Security)" path = /obj/item/clothing/under/rank/security/corp - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -373,7 +529,7 @@ var/global/list/gear_datums = list() /datum/gear/navysecsuit display_name = "uniform, navyblue (Security)" path = /obj/item/clothing/under/rank/security/navyblue - cost = 2 + cost = 1 slot = slot_w_uniform allowed_roles = list("Security Officer","Head of Security","Warden") @@ -389,7 +545,7 @@ var/global/list/gear_datums = list() display_name = "armband, EMT" path = /obj/item/clothing/accessory/armband/medgreen slot = slot_tie - cost = 2 + cost = 1 /datum/gear/armband_engineering display_name = "armband, engineering" @@ -425,21 +581,21 @@ var/global/list/gear_datums = list() display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/hip display_name = "holster, hip" path = /obj/item/clothing/accessory/holster/hip slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/waist display_name = "holster, waist" path = /obj/item/clothing/accessory/holster/waist slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security", "Detective") /datum/gear/tie_blue @@ -464,14 +620,14 @@ var/global/list/gear_datums = list() display_name = "webbing, engineering" path = /obj/item/clothing/accessory/storage/brown_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") /datum/gear/black_vest display_name = "webbing, security" path = /obj/item/clothing/accessory/storage/black_vest slot = slot_tie - cost = 2 + cost = 1 allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/webbing @@ -491,37 +647,37 @@ var/global/list/gear_datums = list() /datum/gear/bomber display_name = "bomber jacket" path = /obj/item/clothing/suit/storage/toggle/bomber - cost = 4 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket display_name = "leather jacket, black" path = /obj/item/clothing/suit/storage/leather_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/leather_jacket_nt display_name = "leather jacket, NanoTrasen, black" path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket display_name = "leather jacket, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket - cost = 3 + cost = 2 slot = slot_wear_suit /datum/gear/brown_jacket_nt display_name = "leather jacket, NanoTrasen, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen - cost = 3 + cost = 2 slot = slot_wear_suit -/datum/gear/blue_lawyer_jacket - display_name = "suit jacket, blue" - path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket - cost = 3 +/datum/gear/hazard_vest + display_name = "hazard vest" + path = /obj/item/clothing/suit/storage/hazardvest + cost = 2 slot = slot_wear_suit /datum/gear/hoodie @@ -533,79 +689,122 @@ var/global/list/gear_datums = list() /datum/gear/hoodie/black display_name = "hoodie, black" path = /obj/item/clothing/suit/storage/toggle/hoodie/black + cost = 2 /datum/gear/unathi_mantle display_name = "hide mantle (Unathi)" path = /obj/item/clothing/suit/unathi/mantle - cost = 2 + cost = 1 slot = slot_wear_suit whitelisted = "Unathi" /datum/gear/labcoat display_name = "labcoat" path = /obj/item/clothing/suit/storage/toggle/labcoat - cost = 3 + cost = 2 + slot = slot_wear_suit + +/datum/gear/bluelabcoat + display_name = "labcoat, blue" + path = /obj/item/clothing/suit/storage/toggle/labcoat/blue + cost = 2 + slot = slot_wear_suit + +/datum/gear/greenlabcoat + display_name = "labcoat, green" + path = /obj/item/clothing/suit/storage/toggle/labcoat/green + cost = 2 + slot = slot_wear_suit + +/datum/gear/orangelabcoat + display_name = "labcoat, orange" + path = /obj/item/clothing/suit/storage/toggle/labcoat/orange + cost = 2 + slot = slot_wear_suit + +/datum/gear/purplelabcoat + display_name = "labcoat, purple" + path = /obj/item/clothing/suit/storage/toggle/labcoat/purple + cost = 2 + slot = slot_wear_suit + +/datum/gear/redlabcoat + display_name = "labcoat, red" + path = /obj/item/clothing/suit/storage/toggle/labcoat/red + cost = 2 slot = slot_wear_suit /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/bponcho display_name = "poncho, blue" path = /obj/item/clothing/suit/poncho/blue - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/gponcho display_name = "poncho, green" path = /obj/item/clothing/suit/poncho/green - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/pponcho display_name = "poncho, purple" path = /obj/item/clothing/suit/poncho/purple - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/rponcho display_name = "poncho, red" path = /obj/item/clothing/suit/poncho/red - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/poncho display_name = "poncho, tan" path = /obj/item/clothing/suit/poncho - cost = 3 + cost = 1 slot = slot_wear_suit /datum/gear/unathi_robe display_name = "roughspun robe (Unathi)" path = /obj/item/clothing/suit/unathi/robe - cost = 3 + cost = 1 slot = slot_wear_suit // whitelisted = "Unathi" // You don't have a monopoly on a robe! +/datum/gear/blue_lawyer_jacket + display_name = "suit jacket, blue" + path = /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket + cost = 2 + slot = slot_wear_suit + +/datum/gear/purple_lawyer_jacket + display_name = "suit jacket, purple" + path = /obj/item/clothing/suit/storage/lawyer/purpjacket + cost = 2 + slot = slot_wear_suit + /datum/gear/suspenders display_name = "suspenders" path = /obj/item/clothing/suit/suspenders - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/wcoat display_name = "waistcoat" path = /obj/item/clothing/suit/wcoat - cost = 2 + cost = 1 slot = slot_wear_suit /datum/gear/zhan_furs display_name = "Zhan-Khazan furs (Tajaran)" path = /obj/item/clothing/suit/tajaran/furs - cost = 3 + cost = 1 slot = slot_wear_suit whitelisted = "Tajara" // You do have a monopoly on a fur suit tho @@ -620,7 +819,7 @@ var/global/list/gear_datums = list() /datum/gear/blue_gloves display_name = "gloves, blue" path = /obj/item/clothing/gloves/blue - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/brown_gloves @@ -629,22 +828,53 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_gloves +/datum/gear/light_brown_gloves + display_name = "gloves, light-brown" + path = /obj/item/clothing/gloves/light_brown + cost = 2 + slot = slot_gloves + /datum/gear/green_gloves display_name = "gloves, green" path = /obj/item/clothing/gloves/green - cost = 1 + cost = 2 slot = slot_gloves +/datum/gear/grey_gloves + display_name = "gloves, grey" + path = /obj/item/clothing/gloves/grey + cost = 2 + slot = slot_gloves + +/datum/gear/latex_gloves + display_name = "gloves, latex" + path = /obj/item/clothing/gloves/latex + cost = 2 + slot = slot_gloves + + /datum/gear/orange_gloves display_name = "gloves, orange" path = /obj/item/clothing/gloves/orange - cost = 1 + cost = 2 + slot = slot_gloves + +/datum/gear/purple_gloves + display_name = "gloves, purple" + path = /obj/item/clothing/gloves/purple + cost = 2 + slot = slot_gloves + +/datum/gear/rainbow_gloves + display_name = "gloves, rainbow" + path = /obj/item/clothing/gloves/rainbow + cost = 2 slot = slot_gloves /datum/gear/red_gloves display_name = "gloves, red" path = /obj/item/clothing/gloves/red - cost = 1 + cost = 2 slot = slot_gloves /datum/gear/white_gloves @@ -658,13 +888,13 @@ var/global/list/gear_datums = list() /datum/gear/jackboots display_name = "jackboots" path = /obj/item/clothing/shoes/jackboots - cost = 2 + cost = 1 slot = slot_shoes /datum/gear/toeless_jackboots display_name = "toe-less jackboots" - path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran //permisson of owner of custom item was granted - cost = 2 + path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran + cost = 1 slot = slot_shoes /datum/gear/sandal @@ -727,6 +957,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_shoes +/datum/gear/rainbow_shoes + display_name = "shoes, rainbow" + path = /obj/item/clothing/shoes/rainbow + cost = 1 + slot = slot_shoes + /datum/gear/red_shoes display_name = "shoes, red" path = /obj/item/clothing/shoes/red @@ -807,7 +1043,7 @@ var/global/list/gear_datums = list() display_name = "cane" path = /obj/item/weapon/cane sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/dice display_name = "d20" @@ -821,6 +1057,17 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/flask + display_name = "flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/barflask + sort_category = "misc" + cost = 1 + +/datum/gear/vacflask + display_name = "vacuum-flask" + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask + sort_category = "misc" + cost = 1 /datum/gear/blipstick display_name = "lipstick, black" path = /obj/item/weapon/lipstick/black @@ -845,17 +1092,35 @@ var/global/list/gear_datums = list() sort_category = "misc" cost = 1 +/datum/gear/smokingpipe + display_name = "pipe, smoking" + path = /obj/item/clothing/mask/smokable/pipe + sort_category = "misc" + cost = 1 + +/datum/gear/cornpipe + display_name = "pipe, corn" + path = /obj/item/clothing/mask/smokable/pipe/cobpipe + sort_category = "misc" + cost = 1 + /datum/gear/matchbook display_name = "matchbook" path = /obj/item/weapon/storage/box/matches sort_category = "misc" - cost = 2 + cost = 1 /datum/gear/comb display_name = "purple comb" path = /obj/item/weapon/haircomb sort_category = "misc" - cost = 2 + cost = 1 + +/datum/gear/zippo + display_name = "zippo" + path = /obj/item/weapon/flame/lighter/zippo + sort_category = "misc" + cost = 1 /*/datum/gear/combitool display_name = "combi-tool" @@ -864,30 +1129,36 @@ var/global/list/gear_datums = list() // Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use // the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset. +/datum/gear/earmuffs + display_name = "earmuffs" + path = /obj/item/clothing/ears/earmuffs + cost = 1 + sort_category = "ears" + /datum/gear/skrell_chain display_name = "skrell headtail-wear, female, chain" path = /obj/item/clothing/ears/skrell/chain - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_plate display_name = "skrell headtail-wear, male, bands" path = /obj/item/clothing/ears/skrell/band - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_male display_name = "skrell headtail-wear, male, cloth" path = /obj/item/clothing/ears/skrell/cloth_male - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" /datum/gear/skrell_cloth_female display_name = "skrell headtail-wear, female, cloth" path = /obj/item/clothing/ears/skrell/cloth_female - cost = 2 + cost = 1 sort_category = "ears" whitelisted = "Skrell" diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index dfa7e120f74..fb675801c9e 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -8,8 +8,8 @@ body_parts_covered = FACE w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/balaclava/tactical @@ -21,8 +21,8 @@ flags_inv = HIDEFACE w_class = 2 sprite_sheets = list( - "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Tajara" = 'icons/mob/species/tajaran/mask.dmi', + "Unathi" = 'icons/mob/species/unathi/mask.dmi', ) /obj/item/clothing/mask/luchador diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 13d1a59d5e7..820ab2fcaa5 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1131,6 +1131,8 @@ icon_state = "parker_eliza_arms" item_state = "parker_eliza_arms" item_color = "parker_eliza_arms" + body_parts_covered = 0 //technicially it's underneath everything + canremove = 0 ////////////// Accessories ///// diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 469896018e8..e64ad1e8131 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -231,12 +231,15 @@ S.remove_from_storage(O, src) O.loc = src + var/newID = 0 for (var/datum/seed_pile/N in piles) if (N.matches(O)) ++N.amount N.seeds += (O) return + else if(N.ID >= newID) + newID = N.ID + 1 - piles += new /datum/seed_pile(O, piles.len) + piles += new /datum/seed_pile(O, newID) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index defe2191bea..7c3599e726d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -523,4 +523,5 @@ playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) Stun(stun_duration) Weaken(Floor(stun_duration/2)) - return 1 \ No newline at end of file + return 1 + diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 466742046bb..5a439731975 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -15,6 +15,10 @@ // Override the current limb status and don't cause an explosion E.droplimb(1,1) + for(var/obj/item/I in src) + drop_from_inventory(I) + I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class)) + ..(species.gibbed_anim) gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 3630d609a34..007f5a35522 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -384,14 +384,14 @@ else if(is_bleeding["right foot"]) display_shoes = 1 if(display_chest) - msg += "[src] has blood soaking through from under [t_his] clothing!\n" + msg += "[src] has blood soaking through from under [t_his] clothing!\n" if(display_shoes) - msg += "[src] has blood running from [t_his] shoes!\n" + msg += "[src] has blood running from [t_his] shoes!\n" if(display_gloves) - msg += "[src] has blood running from under [t_his] gloves!\n" + msg += "[src] has blood running from under [t_his] gloves!\n" for(var/implant in get_visible_implants(0)) - msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" + msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n" if(digitalcamo) msg += "[t_He] [t_is] repulsively uncanny!\n" diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm new file mode 100644 index 00000000000..95ee36b1f6b --- /dev/null +++ b/code/modules/mob/living/carbon/resist.dm @@ -0,0 +1,170 @@ + +/mob/living/carbon/process_resist() + + //drop && roll + if(on_fire) + fire_stacks -= 2 //reduced + Weaken(3) + spin(32,2) + visible_message( + "[src] rolls on the floor, trying to put themselves out!", + "You stop, drop, and roll!" + ) + sleep(30) + if(fire_stacks <= 0) + visible_message( + "[src] has successfully extinguished themselves!", + "You extinguish yourself." + ) + ExtinguishMob() + return + + if(handcuffed) + spawn() escape_handcuffs() + else if(legcuffed) + spawn() escape_legcuffs() + + ..() + +/mob/living/carbon/proc/escape_handcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_handcuffs() + return + + var/obj/item/weapon/handcuffs/HC = handcuffed + + //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + visible_message( + "[src] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) + + if(do_after(src, breakouttime)) + if(!handcuffed || buckled) + return + visible_message( + "[src] manages to remove \the [handcuffed]!", + "You successfully remove \the [handcuffed]." + ) + drop_from_inventory(handcuffed) + +/mob/living/carbon/proc/escape_legcuffs() + if(!(last_special <= world.time)) return + + next_move = world.time + 100 + last_special = world.time + 100 + + if(can_break_cuffs()) //Don't want to do a lot of logic gating here. + break_legcuffs() + return + + var/obj/item/weapon/legcuffs/HC = legcuffed + + //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type + var/breakouttime = 1200 + var/displaytime = 2 //Minutes to display in the "this will take X minutes." + //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... + if(istype(HC)) + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + + visible_message( + "[usr] attempts to remove \the [HC]!", + "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" + ) + + if(do_after(src, breakouttime)) + if(!legcuffed || buckled) + return + visible_message( + "[src] manages to remove \the [legcuffed]!", + "You successfully remove \the [legcuffed]." + ) + + drop_from_inventory(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/proc/can_break_cuffs() + if(HULK in mutations) + return 1 + +/mob/living/carbon/proc/break_handcuffs() + visible_message( + "[src] is trying to break \the [handcuffed]!", + "You attempt to break your [handcuffed.name]. (This will take around 5 seconds and you need to stand still)" + ) + + if(do_after(src, 50)) + if(!handcuffed || buckled) + return + + visible_message( + "[src] manages to break \the [handcuffed]!", + "You successfully break your [handcuffed.name]." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(handcuffed) + handcuffed = null + if(buckled && buckled.buckle_require_restraints) + buckled.unbuckle_mob() + update_inv_handcuffed() + +/mob/living/carbon/proc/break_legcuffs() + src << "You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)" + visible_message("[src] is trying to break the legcuffs!") + + if(do_after(src, 50)) + if(!legcuffed || buckled) + return + + visible_message( + "[src] manages to break the legcuffs!", + "You successfully break your legcuffs." + ) + + say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + + del(legcuffed) + legcuffed = null + update_inv_legcuffed() + +/mob/living/carbon/human/can_break_cuffs() + if(species.can_shred(src,1)) + return 1 + return ..() + +/mob/living/carbon/escape_buckle() + if(!buckled) return + if(!(last_special <= world.time)) return + + if(!restrained()) + ..() + else + next_move = world.time + 100 + last_special = world.time + 100 + visible_message( + "[usr] attempts to unbuckle themself!", + "You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)" + ) + + if(do_after(usr, 1200)) + if(!buckled) + return + visible_message("[usr] manages to unbuckle themself!", + "You successfully unbuckle yourself.") + buckled.user_unbuckle_mob(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a792c24275a..3bf702b872f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -460,284 +460,84 @@ set name = "Resist" set category = "IC" - if(usr.stat || !isliving(usr) || usr.next_move > world.time) - return + if(can_resist()) + next_move = world.time + 20 + process_resist() - usr.next_move = world.time + 20 - - var/mob/living/L = usr +/mob/living/proc/can_resist() + //need to allow !canmove, or otherwise neck grabs can't be resisted + //so just check weakened instead. + if(stat || weakened) + return 0 + if(next_move > world.time) + return 0 + return 1 +/mob/living/proc/process_resist() //Getting out of someone's inventory. - if(istype(src.loc,/obj/item/weapon/holder)) - var/obj/item/weapon/holder/H = src.loc //Get our item holder. - var/mob/M = H.loc //Get our mob holder (if any). - - if(istype(M)) - M.drop_from_inventory(H) - M << "[H] wriggles out of your grip!" - src << "You wriggle out of [M]'s grip!" - else if(istype(H.loc,/obj/item)) - src << "You struggle free of [H.loc]." - H.loc = get_turf(H) - - if(istype(M)) - for(var/atom/A in M.contents) - if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) - return - - M.status_flags &= ~PASSEMOTES + if(istype(src.loc, /obj/item/weapon/holder)) + escape_inventory(src.loc) return - //Resisting control by an alien mind. - if(istype(src.loc,/mob/living/simple_animal/borer)) - var/mob/living/simple_animal/borer/B = src.loc - var/mob/living/captive_brain/H = src - - H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." - B.host << "You feel the captive mind of [src] begin to resist your control." - - spawn(rand(200,250)+B.host.brainloss) - - if(!B || !B.controlling) - return - - B.host.adjustBrainLoss(rand(5,10)) - H << "With an immense exertion of will, you regain control of your body!" - B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." - - B.detatch() - - verbs -= /mob/living/carbon/proc/release_control - verbs -= /mob/living/carbon/proc/punish_host - verbs -= /mob/living/carbon/proc/spawn_larvae - - return - //resisting grabs (as if it helps anyone...) - if ((!( L.stat ) && !( L.restrained() ))) - var/resisting = 0 - for(var/obj/O in L.requests) - L.requests.Remove(O) - del(O) - resisting++ - for(var/obj/item/weapon/grab/G in usr.grabbed_by) - resisting++ - switch(G.state) - if(GRAB_PASSIVE) - del(G) - if(GRAB_AGGRESSIVE) - if(prob(60)) //same chance of breaking the grab as disarm - L.visible_message("[L] has broken free of [G.assailant]'s grip!") - del(G) - if(GRAB_NECK) - //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. - if (((world.time - G.assailant.l_move_time < 30 || !L.stunned) && prob(15)) || prob(3)) - L.visible_message("[L] has broken free of [G.assailant]'s headlock!") - del(G) - if(resisting) - L.visible_message("[L] resists!") - + if (!restrained()) + resist_grab() //unbuckling yourself - if(L.buckled && (L.last_special <= world.time) ) - if(iscarbon(L)) - var/mob/living/carbon/C = L - if( C.handcuffed ) - 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)) - O.show_message("\red [usr] attempts to unbuckle themself!", 1) - spawn(0) - if(do_after(usr, 1200)) - if(!C.buckled) - return - for(var/mob/O in viewers(C)) - O.show_message("\red [usr] manages to unbuckle themself!", 1) - C << "\blue You successfully unbuckle yourself." - C.buckled.user_unbuckle_mob(C) - else - L.buckled.user_unbuckle_mob(L) + if(buckled) + spawn() escape_buckle() //Breaking out of a locker? - else if( src.loc && (istype(src.loc, /obj/structure/closet)) ) - var/breakout_time = 2 //2 minutes by default + if( src.loc && (istype(src.loc, /obj/structure/closet)) ) + var/obj/structure/closet/C = loc + spawn() C.mob_breakout(src) - var/obj/structure/closet/C = L.loc - if(C.opened) - return //Door's open... wait, why are you in it's contents then? - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return //It's a secure closet, but isn't locked. Easily escapable from, no need to 'resist' - else - if(!C.welded) - return //closed but not welded... - // else Meh, lets just keep it at 2 minutes for now - // breakout_time++ //Harder to get out of welded lockers than locked lockers +/mob/living/proc/escape_inventory(obj/item/weapon/holder/H) + if(H != src.loc) return + + var/mob/M = H.loc //Get our mob holder (if any). - //okay, so the closet is either welded or locked... resist!!! - 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)) - O.show_message("\red The [L.loc] begins to shake violently!", 1) + if(istype(M)) + M.drop_from_inventory(H) + M << "[H] wriggles out of your grip!" + src << "You wriggle out of [M]'s grip!" + else if(istype(H.loc,/obj/item)) + src << "You struggle free of [H.loc]." + H.loc = get_turf(H) + if(istype(M)) + for(var/atom/A in M.contents) + if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder)) + return - spawn(0) - if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds - if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened) //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened - return + M.status_flags &= ~PASSEMOTES - //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... - if(istype(L.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - if(!SC.locked && !SC.welded) - return - else - if(!C.welded) - return +/mob/living/proc/escape_buckle() + if(buckled) + buckled.user_unbuckle_mob(src) - //Well then break it! - if(istype(usr.loc, /obj/structure/closet/secure_closet)) - var/obj/structure/closet/secure_closet/SC = L.loc - SC.desc = "It appears to be broken." - SC.icon_state = SC.icon_off - flick(SC.icon_broken, SC) - sleep(10) - flick(SC.icon_broken, SC) - sleep(10) - SC.broken = 1 - SC.locked = 0 - SC.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [SC]!", 1) - if(istype(SC.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace) - var/obj/structure/bigDelivery/BD = SC.loc - BD.attack_hand(usr) - SC.open() - else - C.welded = 0 - C.update_icon() - usr << "\red You successfully break out!" - for(var/mob/O in viewers(L.loc)) - O.show_message("\red \the [usr] successfully broke out of \the [C]!", 1) - if(istype(C.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above - var/obj/structure/bigDelivery/BD = C.loc - BD.attack_hand(usr) - C.open() - - //drop && roll or breaking out of handcuffs - else if(iscarbon(L)) - var/mob/living/carbon/CM = L - if(CM.on_fire && CM.canmove) - CM.fire_stacks -= 5 - CM.Weaken(3) - CM.spin(32,2) - CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \ - "You stop, drop, and roll!") - sleep(30) - if(fire_stacks <= 0) - CM.visible_message("[CM] has successfully extinguished themselves!", \ - "You extinguish yourself.") - ExtinguishMob() - return - if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //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)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the handcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.handcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the handcuffs!", CM), 1) - CM << "\red You successfully break your handcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.handcuffed) - CM.handcuffed = null - if(buckled && buckled.buckle_require_restraints) - buckled.unbuckle_mob() - CM.update_inv_handcuffed() - else - var/obj/item/weapon/handcuffs/HC = CM.handcuffed - var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.handcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the handcuffs!", 1) - CM << "\blue You successfully remove \the [CM.handcuffed]." - CM.drop_from_inventory(CM.handcuffed) - - else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time)) - CM.next_move = world.time + 100 - CM.last_special = world.time + 100 - - var/can_break_cuffs - if(HULK in usr.mutations) - can_break_cuffs = 1 - else if(istype(CM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = CM - if(H.species.can_shred(H,1)) - can_break_cuffs = 1 - - if(can_break_cuffs) //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)" - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] is trying to break the legcuffs!", CM), 1) - spawn(0) - if(do_after(CM, 50)) - if(!CM.legcuffed || CM.buckled) - return - for(var/mob/O in viewers(CM)) - O.show_message(text("\red [] manages to break the legcuffs!", CM), 1) - CM << "\red You successfully break your legcuffs." - CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) - del(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() - else - var/obj/item/weapon/legcuffs/HC = CM.legcuffed - var/breakouttime = 1200 //A default in case you are somehow legcuffed with something that isn't an obj/item/weapon/legcuffs type - var/displaytime = 2 //Minutes to display in the "this will take X minutes." - if(istype(HC)) //If you are legcuffed with actual legcuffs... Well what do I know, maybe someone will want to legcuff you with toilet paper in the future... - breakouttime = HC.breakouttime - displaytime = breakouttime / 600 //Minutes - CM << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" - for(var/mob/O in viewers(CM)) - O.show_message( "\red [usr] attempts to remove \the [HC]!", 1) - spawn(0) - if(do_after(CM, breakouttime)) - if(!CM.legcuffed || CM.buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(CM))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message("\red [CM] manages to remove the legcuffs!", 1) - CM << "\blue You successfully remove \the [CM.legcuffed]." - CM.drop_from_inventory(CM.legcuffed) - CM.legcuffed = null - CM.update_inv_legcuffed() +/mob/living/proc/resist_grab() + var/resisting = 0 + for(var/obj/O in requests) + requests.Remove(O) + del(O) + resisting++ + for(var/obj/item/weapon/grab/G in grabbed_by) + resisting++ + switch(G.state) + if(GRAB_PASSIVE) + del(G) + if(GRAB_AGGRESSIVE) + if(prob(60)) //same chance of breaking the grab as disarm + visible_message("[src] has broken free of [G.assailant]'s grip!") + del(G) + if(GRAB_NECK) + //If the you move when grabbing someone then it's easier for them to break free. Same if the affected mob is immune to stun. + if (((world.time - G.assailant.l_move_time < 30 || !stunned) && prob(15)) || prob(3)) + visible_message("[src] has broken free of [G.assailant]'s headlock!") + del(G) + if(resisting) + visible_message("[src] resists!") /mob/living/verb/lay_down() set name = "Rest" diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index eacc0589452..25cc18cdd26 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -32,4 +32,31 @@ M << "The captive mind of [src] whispers, \"[message]\"" /mob/living/captive_brain/emote(var/message) - return \ No newline at end of file + return + +/mob/living/captive_brain/can_resist() + return !(stat || next_move > world.time) + +/mob/living/captive_brain/process_resist() + //Resisting control by an alien mind. + if(istype(src.loc,/mob/living/simple_animal/borer)) + var/mob/living/simple_animal/borer/B = src.loc + var/mob/living/captive_brain/H = src + + H << "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)." + B.host << "You feel the captive mind of [src] begin to resist your control." + + spawn(rand(200,250)+B.host.brainloss) + if(!B || !B.controlling) return + + B.host.adjustBrainLoss(rand(5,10)) + H << "With an immense exertion of will, you regain control of your body!" + B.host << "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you." + B.detatch() + verbs -= /mob/living/carbon/proc/release_control + verbs -= /mob/living/carbon/proc/punish_host + verbs -= /mob/living/carbon/proc/spawn_larvae + + return + + ..() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 5b207ce2a73..ad41fc28aad 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -56,7 +56,10 @@ verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide - name = "[name] ([rand(1, 1000)])" + if(name == initial(name)) + name = "[name] ([rand(1, 1000)])" + real_name = name + if(!body_color) body_color = pick( list("brown","gray","white") ) icon_state = "mouse_[body_color]" @@ -112,5 +115,10 @@ name = "Tom" desc = "Jerry the cat is not amused." +/mob/living/simple_animal/mouse/brown/Tom/New() + ..() + // Change my name back, don't want to be named Tom (666) + name = initial(name) + /mob/living/simple_animal/mouse/can_use_vents() - return \ No newline at end of file + return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 2b47227dfee..2d26f3b6056 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -96,7 +96,7 @@ affecting.loc = assailant.loc if(state >= GRAB_NECK) - affecting.Stun(1) + affecting.Stun(3) if(isliving(affecting)) var/mob/living/L = affecting L.adjustOxyLoss(1) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6c91d2de032..87d5f002eeb 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -22,6 +22,7 @@ var/info_links //A different version of the paper which includes html links at fields and EOF var/stamps //The (text for the) stamps on the paper. var/fields //Amount of user created fields + var/free_space = MAX_PAPER_MESSAGE_LEN var/list/stamped var/list/ico[0] //Icons and var/list/offset_x[0] //offsets stored for later @@ -51,6 +52,7 @@ spawn(2) update_icon() + update_space(info) updateinfolinks() return @@ -62,6 +64,12 @@ return icon_state = "paper" +/obj/item/weapon/paper/proc/update_space(var/new_text) + if(!new_text) + return + + free_space -= length(strip_html_properly(new_text, 0)) + /obj/item/weapon/paper/examine(mob/user) ..() if(in_range(user, src) || istype(user, /mob/dead/observer)) @@ -188,6 +196,7 @@ /obj/item/weapon/paper/proc/clearpaper() info = null stamps = null + free_space = MAX_PAPER_MESSAGE_LEN stamped = list() overlays.Cut() updateinfolinks() @@ -325,12 +334,11 @@ var/id = href_list["write"] //var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message - var/textlimit = MAX_PAPER_MESSAGE_LEN - length(info) - if(textlimit <= 0) + if(free_space <= 0) usr << "You're trying to find a free place on paper, but can't!" return - var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, textlimit) + var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, free_space) if(!t) return @@ -375,6 +383,8 @@ info += t // Oh, he wants to edit to the end of the file, let him. updateinfolinks() + update_space(t) + usr << browse("[name][info_links][stamps]", "window=[name]") // Update the window update_icon() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 7c9ae41cf25..d513d2ff120 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,7 +9,7 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 - +#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb /obj/item/light_fixture_frame name = "light fixture frame" @@ -487,11 +487,13 @@ var/mob/living/carbon/human/H = user if(istype(H)) - - if(H.gloves) + if(H.species.heat_level_1 > LIGHT_BULB_TEMPERATURE) + prot = 1 + else if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves if(G.max_heat_protection_temperature) - prot = (G.max_heat_protection_temperature > 360) + if(G.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + prot = 1 else prot = 1 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4e81f77e96c..9dceb44fb4b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -124,7 +124,7 @@ if (!ready_to_fire()) if (world.time % 3) //to prevent spam - user << "[src] is not ready to fire again!" + user << "[src] is not ready to fire again!" return var/obj/projectile = consume_next_projectile(user) @@ -170,7 +170,7 @@ if(reflex) user.visible_message( - "[user] fires [src][pointblank ? " point blank at [target]":""] by reflex!", + "[user] fires [src][pointblank ? " point blank at [target]":""] by reflex!", "You fire [src] by reflex]!", "You hear a [fire_sound_text]!" ) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 5b375ed8f7d..d7ef079ef90 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -15,13 +15,15 @@ var/tag_x attack_hand(mob/user as mob) + unwrap() + + proc/unwrap() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.loc = (get_turf(src.loc)) if(istype(wrapped, /obj/structure/closet)) var/obj/structure/closet/O = wrapped O.welded = 0 del(src) - return attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/device/destTagger)) diff --git a/html/changelogs/HarpyEagle-NeckgrabFix.yml b/html/changelogs/HarpyEagle-NeckgrabFix.yml new file mode 100644 index 00000000000..6ff399b77e3 --- /dev/null +++ b/html/changelogs/HarpyEagle-NeckgrabFix.yml @@ -0,0 +1,5 @@ +author: HarpyEagle +delete-after: True + +changes: + - bugfix: "Neck-grabbing someone now stuns them properly." diff --git a/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml b/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml new file mode 100644 index 00000000000..0a994dfbc4c --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-OfMiceAndMen.yml @@ -0,0 +1,5 @@ +author: PsiOmegaDelta +delete-after: True + +changes: + - tweak: "Mice are now numbered to aid admins." diff --git a/html/changelogs/RavingManiac-master.yml b/html/changelogs/RavingManiac-master.yml new file mode 100644 index 00000000000..e3a031deecb --- /dev/null +++ b/html/changelogs/RavingManiac-master.yml @@ -0,0 +1,6 @@ +author: RavingManiac +delete-after: True + +changes: + - tweak: "Candles now burn for about 30 minutes." + - tweak: "Intent menu now appears while zooming with a sniper rifle." diff --git a/html/changelogs/Yoshax-Alloftheitems.YML b/html/changelogs/Yoshax-Alloftheitems.YML new file mode 100644 index 00000000000..57d50b195b7 --- /dev/null +++ b/html/changelogs/Yoshax-Alloftheitems.YML @@ -0,0 +1,4 @@ +author: Yoshax +delete-after: True +changes: + - rscadd: "Adds more items to custom loadout, including a number of dressy suits and some other things." diff --git a/html/changelogs/Yoshax-ICanIntoSurgery.YML b/html/changelogs/Yoshax-ICanIntoSurgery.YML new file mode 100644 index 00000000000..9aa57af213f --- /dev/null +++ b/html/changelogs/Yoshax-ICanIntoSurgery.YML @@ -0,0 +1,5 @@ +author: Yoshax +delete-after: True + +changes: + - tweak: "Adds items to the orderable antag surgical kit so its actually useful for surgery." \ No newline at end of file diff --git a/html/changelogs/Yoshax-LoadoutPoints.YML b/html/changelogs/Yoshax-LoadoutPoints.YML new file mode 100644 index 00000000000..051e156a2d9 --- /dev/null +++ b/html/changelogs/Yoshax-LoadoutPoints.YML @@ -0,0 +1,5 @@ +author: Yoshax +delete-after: True + +changes: + - tweak: "Adjusts custom loadout costs to be more standardised and balances. Purely cosmetic items, shoes, hats, and all things that do not provide a straight advtange (sterile mask, or pAI, protection from viruses and possible door hacking or records access, respectively), each cost 1 point, items that provide an advantage like those just mentioned, or provide armor or storage cost 2 points." \ No newline at end of file diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 777f68c62e6..e27dcab96d6 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ