diff --git a/.travis.yml b/.travis.yml index 10ce658d99..51bb590878 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,9 @@ language: c sudo: false env: - BYOND_MAJOR="510" - BYOND_MINOR="1346" - MACRO_COUNT=986 + BYOND_MAJOR="511" + BYOND_MINOR="1381" + MACRO_COUNT=875 cache: directories: diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 8115790c50..cd0c9955c1 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -123,4 +123,6 @@ var/list/be_special_flags = list( //casting costs #define Sp_RECHARGE "recharge" #define Sp_CHARGES "charges" -#define Sp_HOLDVAR "holdervar" \ No newline at end of file +#define Sp_HOLDVAR "holdervar" + +#define CHANGELING_STASIS_COST 20 \ No newline at end of file diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index eb572aa0e2..0a8598d21f 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -33,7 +33,7 @@ #define PROXMOVE 0x80 // Does this object require proximity checking in Enter()? //Flags for items (equipment) -#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equiped to slot_suit or slot_head. +#define THICKMATERIAL 0x1 // Prevents syringes, parapens and hyposprays if equipped to slot_suit or slot_head. #define STOPPRESSUREDAMAGE 0x2 // Counts towards pressure protection. Note that like temperature protection, body_parts_covered is considered here as well. #define AIRTIGHT 0x4 // Functions with internals. #define NOSLIP 0x8 // Prevents from slipping on wet floors, in space, etc. diff --git a/code/_helpers/datum_pool.dm b/code/_helpers/datum_pool.dm deleted file mode 100644 index b5bcea123f..0000000000 --- a/code/_helpers/datum_pool.dm +++ /dev/null @@ -1,110 +0,0 @@ - -/* -/tg/station13 /atom/movable Pool: ---------------------------------- -By RemieRichards - -Creation/Deletion is laggy, so let's reduce reuse and recycle! - -*/ -#define ATOM_POOL_COUNT 100 -// "define DEBUG_ATOM_POOL 1 -var/global/list/GlobalPool = list() - -//You'll be using this proc 90% of the time. -//It grabs a type from the pool if it can -//And if it can't, it creates one -//The pool is flexible and will expand to fit -//The new created atom when it eventually -//Goes into the pool - -//Second argument can be a new location, if the type is /atom/movable -//Or a list of arguments -//Either way it gets passed to new - -/proc/PoolOrNew(var/get_type,var/second_arg) - var/datum/D - D = GetFromPool(get_type,second_arg) - - if(!D) - // So the GC knows we're pooling this type. - if(!GlobalPool[get_type]) - GlobalPool[get_type] = list() - if(islist(second_arg)) - return new get_type (arglist(second_arg)) - else - return new get_type (second_arg) - return D - -/proc/GetFromPool(var/get_type,var/second_arg) - if(isnull(GlobalPool[get_type])) - return 0 - - if(length(GlobalPool[get_type]) == 0) - return 0 - - var/datum/D = pick_n_take(GlobalPool[get_type]) - if(D) - D.ResetVars() - D.Prepare(second_arg) - return D - return 0 - -/proc/PlaceInPool(var/datum/D) - if(!istype(D)) - return - - if(length(GlobalPool[D.type]) > ATOM_POOL_COUNT) - #ifdef DEBUG_ATOM_POOL - world << text("DEBUG_DATUM_POOL: PlaceInPool([]) exceeds []. Discarding.", D.type, ATOM_POOL_COUNT) - #endif - if(garbage_collector) - garbage_collector.AddTrash(D) - else - del(D) - return - - if(D in GlobalPool[D.type]) - return - - if(!GlobalPool[D.type]) - GlobalPool[D.type] = list() - - GlobalPool[D.type] += D - - D.Destroy() - D.ResetVars() - -/proc/IsPooled(var/datum/D) - if(isnull(GlobalPool[D.type])) - return 0 - return 1 - -/datum/proc/Prepare(args) - if(islist(args)) - New(arglist(args)) - else - New(args) - -/atom/movable/Prepare(args) - var/list/args_list = args - if(istype(args_list) && args_list.len) - loc = args[1] - else - loc = args - ..() - -/datum/proc/ResetVars(var/list/exlude = list()) - var/list/excluded = list("animate_movement", "loc", "locs", "parent_type", "vars", "verbs", "type") + exlude - - for(var/V in vars) - if(V in excluded) - continue - - vars[V] = initial(vars[V]) - -/atom/movable/ResetVars() - ..() - vars["loc"] = null - -#undef ATOM_POOL_COUNT diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 1531a67d5b..b59857c8f6 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -284,7 +284,7 @@ if(M.loc && M.locs[1] in hearturfs) mobs |= M - else if(M.stat == DEAD) + else if(M.stat == DEAD && !M.forbid_seeing_deadchat) switch(type) if(1) //Audio messages use ghost_ears if(M.is_preference_enabled(/datum/client_preference/ghost_ears)) diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index 1e6844b6ad..2081e011b3 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -32,11 +32,6 @@ my_mob.client.screen -= src my_mob = null -/obj/screen/movable/ability_master/ResetVars() - ..("ability_objects", args) - remove_all_abilities() -// ability_objects = list() - /obj/screen/movable/ability_master/MouseDrop() if(showing) return diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index fd226eb70c..a00fa6e10d 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -20,7 +20,7 @@ return null if(!screen) - screen = PoolOrNew(type) + screen = new type() screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index 71eff4a392..3602a52481 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -45,49 +45,61 @@ screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" /obj/screen/movable/proc/encode_screen_X(X) - if(X > usr.client.view+1) - . = "EAST-[usr.client.view*2 + 1-X]" - else if(X < usr.client.view+1) + var/view_dist = world.view + if(view_dist) + view_dist = view_dist + if(X > view_dist+1) + . = "EAST-[view_dist *2 + 1-X]" + else if(X < view_dist +1) . = "WEST+[X-1]" else . = "CENTER" /obj/screen/movable/proc/decode_screen_X(X) + var/view_dist = world.view + if(view_dist) + view_dist = view_dist //Find EAST/WEST implementations if(findtext(X,"EAST-")) var/num = text2num(copytext(X,6)) //Trim EAST- if(!num) num = 0 - . = usr.client.view*2 + 1 - num + . = view_dist*2 + 1 - num else if(findtext(X,"WEST+")) var/num = text2num(copytext(X,6)) //Trim WEST+ if(!num) num = 0 . = num+1 else if(findtext(X,"CENTER")) - . = usr.client.view+1 + . = view_dist+1 /obj/screen/movable/proc/encode_screen_Y(Y) - if(Y > usr.client.view+1) - . = "NORTH-[usr.client.view*2 + 1-Y]" - else if(Y < usr.client.view+1) + var/view_dist = world.view + if(view_dist) + view_dist = view_dist + if(Y > view_dist+1) + . = "NORTH-[view_dist*2 + 1-Y]" + else if(Y < view_dist+1) . = "SOUTH+[Y-1]" else . = "CENTER" /obj/screen/movable/proc/decode_screen_Y(Y) + var/view_dist = world.view + if(view_dist) + view_dist = view_dist if(findtext(Y,"NORTH-")) var/num = text2num(copytext(Y,7)) //Trim NORTH- if(!num) num = 0 - . = usr.client.view*2 + 1 - num + . = view_dist*2 + 1 - num else if(findtext(Y,"SOUTH+")) var/num = text2num(copytext(Y,7)) //Time SOUTH+ if(!num) num = 0 . = num+1 else if(findtext(Y,"CENTER")) - . = usr.client.view+1 + . = view_dist+1 //Debug procs /client/proc/test_movable_UI() diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index 262ece09e4..a599381730 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -23,10 +23,6 @@ spell_holder.client.screen -= src spell_holder = null -/obj/screen/movable/spell_master/ResetVars() - ..("spell_objects", args) - spell_objects = list() - /obj/screen/movable/spell_master/MouseDrop() if(showing) return @@ -93,7 +89,7 @@ if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one return - var/obj/screen/spell/newscreen = PoolOrNew(/obj/screen/spell) + var/obj/screen/spell/newscreen = new /obj/screen/spell() newscreen.spellmaster = src newscreen.spell = spell diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 4c976f4458..f08727abf3 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -149,7 +149,7 @@ var/const/tk_maxrange = 15 /obj/item/tk_grab/proc/apply_focus_overlay() if(!focus) return - var/obj/effect/overlay/O = PoolOrNew(/obj/effect/overlay, locate(focus.x,focus.y,focus.z)) + var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z)) O.name = "sparkles" O.anchored = 1 O.density = 0 diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm index 2d56dde1a2..02f0411332 100644 --- a/code/controllers/Processes/garbage.dm +++ b/code/controllers/Processes/garbage.dm @@ -152,19 +152,13 @@ world/loop_checks = 0 A.finalize_qdel() /datum/proc/finalize_qdel() - if(IsPooled(src)) - PlaceInPool(src) - else - del(src) + del(src) /atom/finalize_qdel() - if(IsPooled(src)) - PlaceInPool(src) + if(garbage_collector) + garbage_collector.AddTrash(src) else - if(garbage_collector) - garbage_collector.AddTrash(src) - else - delayed_garbage |= src + delayed_garbage |= src /icon/finalize_qdel() del(src) @@ -180,7 +174,7 @@ world/loop_checks = 0 // Default implementation of clean-up code. // This should be overridden to remove all references pointing to the object being destroyed. -// Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.) +// Return true if the the GC controller should allow the object to continue existing. /datum/proc/Destroy() nanomanager.close_uis(src) tag = null diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm new file mode 100644 index 0000000000..e87be74f53 --- /dev/null +++ b/code/datums/repositories/decls.dm @@ -0,0 +1,39 @@ +/var/repository/decls/decls_repository = new() + +/repository/decls + var/list/fetched_decls + var/list/fetched_decl_types + var/list/fetched_decl_subtypes + +/repository/decls/New() + ..() + fetched_decls = list() + fetched_decl_types = list() + fetched_decl_subtypes = list() + +/repository/decls/proc/decls_of_type(var/decl_prototype) + . = fetched_decl_types[decl_prototype] + if(!.) + . = get_decls(typesof(decl_prototype)) + fetched_decl_types[decl_prototype] = . + +/repository/decls/proc/decls_of_subtype(var/decl_prototype) + . = fetched_decl_subtypes[decl_prototype] + if(!.) + . = get_decls(subtypesof(decl_prototype)) + fetched_decl_subtypes[decl_prototype] = . + +/repository/decls/proc/get_decl(var/decl_type) + . = fetched_decls[decl_type] + if(!.) + . = new decl_type() + fetched_decls[decl_type] = . + +/repository/decls/proc/get_decls(var/list/decl_types) + . = list() + for(var/decl_type in decl_types) + .[decl_type] = get_decl(decl_type) + +/decls/Destroy() + crash_with("Prevented attempt to delete a decl instance: [log_info_line(src)]") + return 1 // Prevents Decl destruction \ No newline at end of file diff --git a/code/datums/repositories/repository.dm b/code/datums/repositories/repository.dm index 6267099c93..04eee50540 100644 --- a/code/datums/repositories/repository.dm +++ b/code/datums/repositories/repository.dm @@ -1,4 +1,19 @@ +/repository/New() + return + /datum/cache_entry var/timestamp var/data +/datum/cache_entry/New() + timestamp = world.time + +/datum/cache_entry/proc/is_valid() + return FALSE + +/datum/cache_entry/valid_until/New(var/valid_duration) + ..() + timestamp += valid_duration + +/datum/cache_entry/valid_until/is_valid() + return world.time < timestamp \ No newline at end of file diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm index d6427f063f..0c7fd3f4ed 100644 --- a/code/datums/supplypacks/contraband.dm +++ b/code/datums/supplypacks/contraband.dm @@ -32,6 +32,17 @@ containername = "Special Ops crate" contraband = 1 +/datum/supply_packs/supply/moghes + name = "Moghes imports" + contains = list( + /obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew = 2, + /obj/item/weapon/reagent_containers/food/snacks/unajerky = 4 + ) + cost = 25 + containertype = /obj/structure/closet/crate + containername = "Moghes imports crate" + contraband = 1 + /datum/supply_packs/security/bolt_rifles_mosin name = "Surplus militia rifles" contains = list( diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index 1ec25bc28d..e248acc46c 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -200,6 +200,7 @@ /obj/item/clothing/under/det/black = 2, /obj/item/clothing/under/det/grey = 2, /obj/item/clothing/head/det/grey = 2, + /obj/item/clothing/under/det/skirt = 2, /obj/item/clothing/under/det = 2, /obj/item/clothing/head/det = 2, /obj/item/clothing/suit/storage/det_trench, diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index 83cae026ce..59f33be094 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -8,11 +8,6 @@ icon_state = "undershirt" has_color = TRUE -/datum/category_item/underwear/undershirt/shirt_long - name = "Long Shirt" - icon_state = "undershirt_long" - has_color = TRUE - /datum/category_item/underwear/undershirt/shirt_fem name = "Babydoll shirt" icon_state = "undershirt_fem" @@ -23,11 +18,22 @@ icon_state = "undershirt_long" has_color = TRUE +/datum/category_item/underwear/undershirt/shirt_long_s + name = "Shirt, button-down" + icon_state = "shirt_long_s" + has_color = TRUE + /datum/category_item/underwear/undershirt/shirt_long_fem name = "Longsleeve Shirt, feminine" icon_state = "undershirt_long_fem" has_color = TRUE +/datum/category_item/underwear/undershirt/shirt_long_female_s + name = "Button-down Shirt, feminine" + icon_state = "shirt_long_female_s" + has_color = TRUE + + /datum/category_item/underwear/undershirt/tank_top name = "Tank top" icon_state = "tanktop" diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm index eab9d9cd02..0c616793ca 100644 --- a/code/datums/uplink/medical.dm +++ b/code/datums/uplink/medical.dm @@ -22,12 +22,12 @@ /datum/uplink_item/item/medical/clotting name = "Clotting Medicine injector" item_cost = 10 - path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting /datum/uplink_item/item/medical/bonemeds name = "Bone Repair injector" item_cost = 10 - path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed + path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed /datum/uplink_item/item/medical/ambrosiadeusseeds name = "Box of 7x ambrosia deus seed packets" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 376ae965cc..be536612b4 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -49,7 +49,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/no_air = null // var/list/lights // list of all lights on this area var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area - var/air_doors_activated = 0 + var/firedoors_closed = 0 var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') var/list/forced_ambience = null var/sound_env = STANDARD_STATION diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 1e52a4a70c..f6a965dcf7 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -53,26 +53,40 @@ danger_level = max(danger_level, AA.danger_level) if(danger_level != atmosalm) - if (danger_level < 1 && atmosalm >= 1) - //closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise - air_doors_open() - for(var/obj/machinery/light/L in src) - L.reset_alert() - else if (danger_level >= 2 && atmosalm < 2) - air_doors_close() - for(var/obj/machinery/light/L in src) - L.set_alert_atmos() - atmosalm = danger_level + //closing the doors on red and opening on green provides a bit of hysteresis that will hopefully prevent fire doors from opening and closing repeatedly due to noise + if (danger_level < 1 || danger_level >= 2) + firedoors_update() + for (var/obj/machinery/alarm/AA in src) AA.update_icon() return 1 return 0 -/area/proc/air_doors_close() - if(!air_doors_activated) - air_doors_activated = 1 +// Either close or open firedoors depending on current alert statuses +/area/proc/firedoors_update() + if(fire || party || atmosalm) + firedoors_close() + // VOREStation Edit - Make the lights colored! + if(fire) + for(var/obj/machinery/light/L in src) + L.set_alert_fire() + else if(atmosalm) + for(var/obj/machinery/light/L in src) + L.set_alert_atmos() + // VOREStation Edit End + else + firedoors_open() + // VOREStation Edit - Put the lights back! + for(var/obj/machinery/light/L in src) + L.reset_alert() + // VOREStation Edit End + +// Close all firedoors in the area +/area/proc/firedoors_close() + if(!firedoors_closed) + firedoors_closed = TRUE for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) @@ -81,9 +95,10 @@ spawn(0) E.close() -/area/proc/air_doors_open() - if(air_doors_activated) - air_doors_activated = 0 +// Open all firedoors in the area +/area/proc/firedoors_open() + if(firedoors_closed) + firedoors_closed = FALSE for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) @@ -97,31 +112,13 @@ if(!fire) fire = 1 //used for firedoor checks updateicon() - mouse_opacity = 0 - for(var/obj/machinery/door/firedoor/D in all_doors) - if(!D.blocked) - if(D.operating) - D.nextstate = FIREDOOR_CLOSED - else if(!D.density) - spawn() - D.close() - for(var/obj/machinery/light/L in src) - L.set_alert_fire() + firedoors_update() /area/proc/fire_reset() if (fire) fire = 0 //used for firedoor checks updateicon() - mouse_opacity = 0 - for(var/obj/machinery/door/firedoor/D in all_doors) - if(!D.blocked) - if(D.operating) - D.nextstate = FIREDOOR_OPEN - else if(D.density) - spawn(0) - D.open() - for(var/obj/machinery/light/L in src) - L.reset_alert() + firedoors_update() /area/proc/readyalert() if(!eject) @@ -139,21 +136,14 @@ if (!( party )) party = 1 updateicon() - mouse_opacity = 0 + firedoors_update() return /area/proc/partyreset() if (party) party = 0 - mouse_opacity = 0 updateicon() - for(var/obj/machinery/door/firedoor/D in src) - if(!D.blocked) - if(D.operating) - D.nextstate = FIREDOOR_OPEN - else if(D.density) - spawn(0) - D.open() + firedoors_update() return /area/proc/updateicon() diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 2234e0a540..e54eb3c1cd 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -21,6 +21,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment. var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name. var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too. + var/last_shriek = null // world.time when the ling last used a shriek. /datum/changeling/New(var/gender=FEMALE) ..() @@ -156,6 +157,46 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E //STINGS// //They get a pretty header because there's just so fucking many of them ;_; ////////// +turf/proc/AdjacentTurfsRangedSting() + //Yes this is snowflakey, but I couldn't get it to work any other way.. -Luke + var/list/allowed = list( + /obj/structure/table, + /obj/structure/closet, + /obj/structure/frame, + /obj/structure/target_stake, + /obj/structure/cable, + /obj/structure/disposalpipe, + /obj/machinery/ + ) + + var/L[] = new() + for(var/turf/simulated/t in oview(src,1)) + var/add = 1 + if(t.density) + add = 0 + if(add && LinkBlocked(src,t)) + add = 0 + if(add && TurfBlockedNonWindow(t)) + add = 0 + for(var/obj/O in t) + if(!O.density) + add = 1 + break + if(istype(O, /obj/machinery/door)) + //not sure why this doesn't fire on LinkBlocked() + add = 0 + break + for(var/type in allowed) + if (istype(O, type)) + add = 1 + break + if(!add) + break + if(add) + L.Add(t) + return L + + /mob/proc/sting_can_reach(mob/M as mob, sting_range = 1) if(M.loc == src.loc) return 1 //target and source are in the same thing @@ -163,7 +204,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E src << "We cannot reach \the [M] with a sting!" return 0 //One is inside, the other is outside something. // Maximum queued turfs set to 25; I don't *think* anything raises sting_range above 2, but if it does the 25 may need raising - if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail + if(!AStar(src.loc, M.loc, /turf/proc/AdjacentTurfsRangedSting, /turf/proc/Distance, max_nodes=25, max_node_depth=sting_range)) //If we can't find a path, fail src << "We cannot find a path to sting \the [M] by!" return 0 return 1 diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index e8ed12a446..9c73a4e3d2 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -32,7 +32,7 @@ return 1 if(M.head || M.wear_suit) //Make sure our slots aren't full - src << "We require nothing to be on our head, and we cannot wear any external suits." + src << "We require nothing to be on our head, and we cannot wear any external suits, or shoes." return 0 var/obj/item/clothing/suit/A = new armor_type(src) @@ -140,7 +140,7 @@ playsound(src, 'sound/effects/blobattack.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["w_uniform"] if(!M.w_uniform && t) @@ -150,7 +150,7 @@ playsound(src, 'sound/effects/blobattack.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["gloves"] if(!M.gloves && t) @@ -160,7 +160,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["shoes"] if(!M.shoes && t) @@ -170,7 +170,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["belt"] if(!M.belt && t) @@ -180,7 +180,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["glasses"] if(!M.glasses && t) @@ -190,7 +190,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["wear_mask"] if(!M.wear_mask && t) @@ -200,7 +200,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["back"] if(!M.back && t) @@ -210,7 +210,7 @@ playsound(src, 'sound/effects/blobattack.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["wear_suit"] if(!M.wear_suit && t) @@ -220,7 +220,7 @@ playsound(src, 'sound/effects/blobattack.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) t = stuff_to_equip["wear_id"] if(!M.wear_id && t) @@ -230,7 +230,7 @@ playsound(src, 'sound/effects/splat.ogg', 30, 1) M.update_icons() success = 1 - sleep(20) + sleep(1 SECOND) var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) diff --git a/code/game/gamemodes/changeling/powers/boost_range.dm b/code/game/gamemodes/changeling/powers/boost_range.dm index fd15d94dae..a22130484c 100644 --- a/code/game/gamemodes/changeling/powers/boost_range.dm +++ b/code/game/gamemodes/changeling/powers/boost_range.dm @@ -18,11 +18,11 @@ if(!changeling) return 0 changeling.chem_charges -= 10 - src << "Your throat adjusts to launch the sting." + to_chat(src, "Your throat adjusts to launch the sting.") var/range = 2 if(src.mind.changeling.recursive_enhancement) range = range + 3 - src << "We can fire our next sting from five squares away." + to_chat(src, "We can fire our next sting from five squares away.") changeling.sting_range = range src.verbs -= /mob/proc/changeling_boost_range spawn(5) diff --git a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm index f106d9167f..138cd156e3 100644 --- a/code/game/gamemodes/changeling/powers/fabricate_clothing.dm +++ b/code/game/gamemodes/changeling/powers/fabricate_clothing.dm @@ -18,7 +18,7 @@ var/global/list/changeling_fabricated_clothing = list( helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \ To remove our new fabricated clothing, use this ability again." ability_icon_state = "ling_fabricate_clothing" - genomecost = 2 + genomecost = 1 verbpath = /mob/proc/changeling_fabricate_clothing //Grows biological versions of chameleon clothes. diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm index dee603fc4a..765dbb51e6 100644 --- a/code/game/gamemodes/changeling/powers/fake_death.dm +++ b/code/game/gamemodes/changeling/powers/fake_death.dm @@ -12,7 +12,7 @@ set category = "Changeling" set name = "Regenerative Stasis (20)" - var/datum/changeling/changeling = changeling_power(20,1,100,DEAD) + var/datum/changeling/changeling = changeling_power(CHANGELING_STASIS_COST,1,100,DEAD) if(!changeling) return @@ -28,6 +28,7 @@ C.update_canmove() C.remove_changeling_powers() + changeling.chem_charges -= CHANGELING_STASIS_COST if(C.suiciding) C.suiciding = 0 @@ -35,7 +36,9 @@ if(C.stat != DEAD) C.adjustOxyLoss(C.maxHealth * 2) - spawn(rand(800,2000)) + C.forbid_seeing_deadchat = TRUE + + spawn(rand(2 MINUTES, 4 MINUTES)) //The ling will now be able to choose when to revive src.verbs += /mob/proc/changeling_revive src << "We are ready to rise. Use the Revive verb when you are ready." diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm index d984083aba..66f13e720f 100644 --- a/code/game/gamemodes/changeling/powers/respec.dm +++ b/code/game/gamemodes/changeling/powers/respec.dm @@ -29,6 +29,3 @@ src << "We have removed our evolutions from this form, and are now ready to readapt." ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])") - - //Now to lose the verb, so no unlimited resets. - diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 2f0b9c57e7..c640e35392 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -41,6 +41,10 @@ current_limb.undislocate() current_limb.open = 0 + BITSET(H.hud_updateflag, HEALTH_HUD) + BITSET(H.hud_updateflag, STATUS_HUD) + BITSET(H.hud_updateflag, LIFE_HUD) + C.halloss = 0 C.shock_stage = 0 //Pain C << "We have regenerated." @@ -48,8 +52,12 @@ C.mind.changeling.purchased_powers -= C feedback_add_details("changeling_powers","CR") C.stat = CONSCIOUS + C.forbid_seeing_deadchat = FALSE C.timeofdeath = null src.verbs -= /mob/proc/changeling_revive // re-add our changeling powers C.make_changeling() + + + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index ded66148fa..37e7f67fe0 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -35,6 +35,14 @@ src << "You can't speak!" return 0 + if(world.time < (changeling.last_shriek + 10 SECONDS) ) + to_chat(src, "We are still recovering from our last shriek...") + return 0 + + if(!isturf(loc)) + to_chat(src, "Shrieking here would be a bad idea.") + return 0 + src.break_cloak() //No more invisible shrieking changeling.chem_charges -= 20 @@ -47,6 +55,8 @@ message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (JMP).") log_game("[key_name(src)] used Resonant Shriek.") + visible_message("[src] appears to shout.") + for(var/mob/living/M in range(range, src)) if(iscarbon(M)) if(!M.mind || !M.mind.changeling) @@ -73,11 +83,7 @@ L.on = 1 L.broken() -/* src.verbs -= /mob/proc/changeling_resonant_shriek - spawn(30 SECONDS) - src << "We are ready to use our resonant shriek once more." - src.verbs |= /mob/proc/changeling_resonant_shriek -Ability Cooldowns don't work properly right now, need to redo this when they are */ + changeling.last_shriek = world.time feedback_add_details("changeling_powers","RS") return 1 @@ -101,6 +107,14 @@ Ability Cooldowns don't work properly right now, need to redo this when they are src << "You can't speak!" return 0 + if(world.time < (changeling.last_shriek + 10 SECONDS) ) + to_chat(src, "We are still recovering from our last shriek...") + return 0 + + if(!isturf(loc)) + to_chat(src, "Shrieking here would be a bad idea.") + return 0 + src.break_cloak() //No more invisible shrieking changeling.chem_charges -= 20 @@ -117,6 +131,8 @@ Ability Cooldowns don't work properly right now, need to redo this when they are src << "We are extra loud." src.mind.changeling.recursive_enhancement = 0 + visible_message("[src] appears to shout.") + src.attack_log += text("\[[time_stamp()]\] Used Dissonant Shriek.") message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (JMP).") log_game("[key_name(src)] used Dissonant Shriek.") @@ -126,9 +142,6 @@ Ability Cooldowns don't work properly right now, need to redo this when they are L.broken() empulse(get_turf(src), range_heavy, range_light, 1) -/* src.verbs -= /mob/proc/changeling_dissonant_shriek - spawn(30 SECONDS) - src << "We are ready to use our dissonant shriek once more." - src.verbs |= /mob/proc/changeling_dissonant_shriek -Ability Cooldowns don't work properly right now, need to redo this when they are */ + changeling.last_shriek = world.time + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index 236af69f5f..37a9945210 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -13,6 +13,10 @@ var/datum/changeling/changeling = changeling_power(5,1,0) if(!changeling) return + if(!isturf(loc)) + to_chat(src, "Transforming here would be a bad idea.") + return 0 + var/list/names = list() for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna) names += "[DNA.name]" diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm index 00e31cc932..167f6f41b9 100644 --- a/code/game/gamemodes/changeling/powers/visible_camouflage.dm +++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm @@ -3,7 +3,7 @@ desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \ We are undetectable, so long as we move slowly.(Toggle)" helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden." - enhancedtext = "True invisiblity while cloaked." + enhancedtext = "Can run while hidden." ability_icon_state = "ling_camoflage" genomecost = 3 verbpath = /mob/proc/changeling_visible_camouflage @@ -31,20 +31,35 @@ var/old_regen_rate = H.mind.changeling.chem_recharge_rate H << "We vanish from sight, and will remain hidden, so long as we move carefully." - H.set_m_intent("walk") H.mind.changeling.cloaked = 1 H.mind.changeling.chem_recharge_rate = 0 animate(src,alpha = 255, alpha = 10, time = 10) + var/must_walk = TRUE if(src.mind.changeling.recursive_enhancement) - H.invisibility = INVISIBILITY_OBSERVER - src << "We are now truly invisible." + must_walk = FALSE + to_chat(src, "We may move at our normal speed while hidden.") + + if(must_walk) + H.set_m_intent("walk") + + var/remain_cloaked = TRUE + while(remain_cloaked) //This loop will keep going until the player uncloaks. + sleep(1 SECOND) // Sleep at the start so that if something invalidates a cloak, it will drop immediately after the check and not in one second. + + if(H.m_intent != "walk" && must_walk) // Moving too fast uncloaks you. + remain_cloaked = 0 + if(!H.mind.changeling.cloaked) + remain_cloaked = 0 + if(H.stat) // Dead or unconscious lings can't stay cloaked. + remain_cloaked = 0 + if(H.incapacitated(INCAPACITATION_DISABLED)) // Stunned lings also can't stay cloaked. + remain_cloaked = 0 - while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks. if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked. old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding. - sleep(10) + H.invisibility = initial(invisibility) diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index 2adc25d35d..5e3754a872 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -59,7 +59,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(14) Holiday["Pi Day"] = "An unoffical holiday celebrating the mathematical constant Pi. It is celebrated on \ March 14th, as the digits form 3 14, the first three significant digits of Pi. Observance of Pi Day generally \ - imvolve eating (or throwing) pie, due to a pun. Pies also tend to be round, and thus relatable to Pi." + involve eating (or throwing) pie, due to a pun. Pies also tend to be round, and thus relatable to Pi." if(17) Holiday["St. Patrick's Day"] = "An old holiday originating from Earth, Sol, celebrating the color green, \ shamrocks, attending parades, and drinking alcohol." @@ -93,6 +93,12 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t switch(DD) if(1) Holiday["Interstellar Workers' Day"] = "This holiday celebrates the work of laborers and the working class." + if(18) + Holiday["Remembrance Day"] = "Remembrance Day (or, as it is more informally known, Armistice Day) is a confederation-wide holiday \ + mostly observed by its member states since late 2520. Officially, it is a day of remembering the men and women who died in various armed conflicts \ + throughout human history. Unofficially, however, it is commonly treated as a holiday honoring the victims of the Human-Unathi war. \ + Observance of this day varies throughout human space, but most common traditions are the act of bringing flowers to graves,\ + attending parades, and the wearing of poppies (either paper or real) in one's clothing." if(28) Holiday["Jiql-tes"] = "A Skrellian holiday that translates to 'Day of Celebration', Skrell communities \ gather for a grand feast and give gifts to friends and close relatives." @@ -105,6 +111,9 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(14) Holiday["Blood Donor Day"] = "This holiday was created to raise awareness of the need for safe blood and blood products, \ and to thank blood donors for their voluntary, life-saving gifts of blood." + if(20) + Holiday["Civil Servant's Day"] = "Civil Servant's Day is a holiday observed in SCG member states that honors civil servants everywhere,\ ++ (especially those who are members of the armed forces and the emergency services), or have been or have been civil servants in the past." if(7) //Jul switch(DD) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 2d43e67f24..b9418bfea9 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -7,20 +7,13 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' /datum/game_mode/heist name = "Heist" config_tag = "heist" - required_players = 8 - required_players_secret = 8 - required_enemies = 3 + required_players = 15 + required_players_secret = 15 + required_enemies = 4 round_description = "An unidentified bluespace signature is approaching the station!" extended_round_description = "The Company's majority control of phoron in the system has marked the \ station to be a highly valuable target for many competing organizations and individuals. Being a \ colony of sizable population and considerable wealth causes it to often be the target of various \ attempts of robbery, fraud and other malicious actions." end_on_antag_death = 0 - antag_tags = list(MODE_RAIDER) - -/datum/game_mode/heist/check_finished() - if(!..()) - var/datum/shuttle/multi_shuttle/skipjack = shuttle_controller.shuttles["Skipjack"] - if (skipjack && skipjack.returned_home) - return 1 - return 0 + antag_tags = list(MODE_RAIDER) \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index e2f6b8a56c..098f9fd329 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -12,9 +12,9 @@ var/list/nuke_disks = list() colony of sizable population and considerable wealth causes it to often be the target of various \ attempts of robbery, fraud and other malicious actions." config_tag = "mercenary" - required_players = 8 - required_players_secret = 8 - required_enemies = 3 + required_players = 15 + required_players_secret = 15 + required_enemies = 4 end_on_antag_death = 0 var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm index 3cdf7014ad..d5d28bc118 100644 --- a/code/game/gamemodes/technomancer/assistance/assistance.dm +++ b/code/game/gamemodes/technomancer/assistance/assistance.dm @@ -30,7 +30,7 @@ /obj/item/weapon/antag_spawner/technomancer_apprentice/New() ..() - sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(5, 0, src) sparks.attach(loc) diff --git a/code/game/gamemodes/technomancer/devices/hypos.dm b/code/game/gamemodes/technomancer/devices/hypos.dm index b54ce5e35c..dd0fa4436a 100644 --- a/code/game/gamemodes/technomancer/devices/hypos.dm +++ b/code/game/gamemodes/technomancer/devices/hypos.dm @@ -5,12 +5,11 @@ amount_per_transfer_from_this = 15 volume = 15 origin_tech = list(TECH_BIO = 4) + filled_reagents = list("inaprovaline" = 15) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/New() ..() - reagents.remove_reagent("inaprovaline", 5) - update_icon() - return + /datum/technomancer/consumable/hypo_brute name = "Trauma Hypo" @@ -66,127 +65,44 @@ name = "trauma hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on victims of \ moderate blunt trauma." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/New() - ..() - reagents.add_reagent("bicaridine", 15) - update_icon() - return + filled_reagents = list("bicaridine" = 15) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn name = "burn hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on burn victims, \ featuring an optimized chemical mixture to allow for rapid healing." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/New() - ..() - reagents.add_reagent("kelotane", 7.5) - reagents.add_reagent("dermaline", 7.5) - update_icon() - return + filled_reagents = list("kelotane" = 7.5, "dermaline" = 7.5) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin name = "toxin hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract toxins." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/New() - ..() - reagents.add_reagent("anti_toxin", 15) - update_icon() - return + filled_reagents = list("anti_toxin" = 15) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy name = "oxy hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract oxygen \ deprivation." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/New() - ..() - reagents.add_reagent("dexalinp", 10) - reagents.add_reagent("tricordrazine", 5) //Dex+ ODs above 10, so we add tricord to pad it out somewhat. - update_icon() - return + filled_reagents = list("dexalinp" = 10, "tricordrazine" = 5) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity name = "purity hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This varient excels at \ resolving viruses, infections, radiation, and genetic maladies." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/New() - ..() - reagents.add_reagent("spaceacillin", 9) - reagents.add_reagent("arithrazine", 5) - reagents.add_reagent("ryetalyn", 1) - update_icon() - return + filled_reagents = list("spaceacillin" = 9, "arithrazine" = 5, "ryetalyn" = 1) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain name = "pain hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one contains potent painkillers." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/New() - ..() - reagents.add_reagent("tramadol", 15) - update_icon() - return + filled_reagents = list("tramadol" = 15) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ name = "organ hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this varient." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/New() - ..() - reagents.add_reagent("alkysine", 1) - reagents.add_reagent("imidazoline", 1) - reagents.add_reagent("peridaxon", 13) - update_icon() - return + filled_reagents = list("alkysine" = 1, "imidazoline" = 1, "peridaxon" = 13) /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat name = "combat hypo" desc = "A refined version of the standard autoinjector, allowing greater capacity. This is a more dangerous and potentially \ addictive hypo compared to others, as it contains a potent cocktail of various chemicals to optimize the recipient's combat \ ability." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/New() - ..() - reagents.add_reagent("bicaridine", 3) - reagents.add_reagent("kelotane", 1.5) - reagents.add_reagent("dermaline", 1.5) - reagents.add_reagent("oxycodone", 3) - reagents.add_reagent("hyperzine", 3) - reagents.add_reagent("tricordrazine", 3) - update_icon() - return + filled_reagents = list("bicaridine" = 3, "kelotane" = 1.5, "dermaline" = 1.5, "oxycodone" = 3, "hyperzine" = 3, "tricordrazine" = 3) diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index bacb2c60ed..0bbb6ef085 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -26,7 +26,7 @@ /obj/item/clothing/suit/armor/shield/New() ..() - spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) /obj/item/clothing/suit/armor/shield/Destroy() diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 5c440d0dcd..8d1fb4c6ad 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -191,6 +191,7 @@ icon_state = "scepter" force = 15 slot_flags = SLOT_BELT + attack_verb = list("beaten", "smashed", "struck", "whacked") /obj/item/weapon/scepter/attack_self(mob/living/carbon/human/user) var/obj/item/item_to_test = user.get_other_hand(src) diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index fa9985b1b6..be35adec6e 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -102,7 +102,7 @@ rng = rand(0,1) switch(rng) if(0) - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(5, 0, src) sparks.attach(loc) sparks.start() @@ -167,10 +167,10 @@ rng = rand(0,1) switch(rng) if(0) - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(5, 0, src) sparks.attach(loc) -// var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) +// var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() // spark_system.set_up(5, 0, get_turf(src)) // spark_system.attach(src) sparks.start() @@ -285,4 +285,4 @@ to_chat(H, "The purple glow makes you feel strange...") H.adjust_instability(outgoing_instability) - set_light(distance, distance * 2, l_color = "#C26DDE") + set_light(distance, distance * 4, l_color = "#C26DDE") diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index fb22001d30..faaf3ee75a 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -247,7 +247,7 @@ if(!path || !ispath(path)) return 0 - //var/obj/item/weapon/spell/S = PoolOrNew(path, src) + //var/obj/item/weapon/spell/S = new path(src) var/obj/item/weapon/spell/S = new path(src) //No hands needed for innate casts. diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm index c02e1c1ac5..c303c2a5fb 100644 --- a/code/game/gamemodes/technomancer/spells/condensation.dm +++ b/code/game/gamemodes/technomancer/spells/condensation.dm @@ -24,7 +24,7 @@ spawn(1) var/turf/desired_turf = get_step(T,direction) if(desired_turf) // This shouldn't fail but... - var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(T)) + var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(T)) W.create_reagents(60) W.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0) W.set_color() diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm index 87edf6a621..10f258bf58 100644 --- a/code/game/gamemodes/technomancer/spells/dispel.dm +++ b/code/game/gamemodes/technomancer/spells/dispel.dm @@ -21,5 +21,6 @@ for(var/obj/item/weapon/inserted_spell/I in target) I.on_expire(dispelled = 1) log_and_message_admins("dispelled [I] on [target].") + target.remove_modifiers_of_type(/datum/modifier/technomancer) user.adjust_instability(10) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm index 12f04db48c..50a9bf5da7 100644 --- a/code/game/gamemodes/technomancer/spells/illusion.dm +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -93,6 +93,9 @@ var/walking = 0 var/step_delay = 10 +/mob/living/simple_animal/illusion/update_icon() // We don't want the appearance changing AT ALL unless by copy_appearance(). + return + /mob/living/simple_animal/illusion/proc/copy_appearance(var/atom/movable/thing_to_copy) if(!thing_to_copy) return 0 diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm deleted file mode 100644 index 0ecd700732..0000000000 --- a/code/game/gamemodes/technomancer/spells/insert/corona.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/technomancer/spell/corona - name = "Corona" - desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \ - bright glow also makes it very difficult to be stealthy. The effect lasts for one minute." - spell_power_desc = "Enemies become even easier to hit." - cost = 50 - obj_path = /obj/item/weapon/spell/insert/corona - ability_icon_state = "tech_corona" - category = SUPPORT_SPELLS - -/obj/item/weapon/spell/insert/corona - name = "corona" - desc = "How brillient!" - icon_state = "radiance" - cast_methods = CAST_RANGED - aspect = ASPECT_LIGHT - light_color = "#D9D900" - spell_light_intensity = 5 - spell_light_range = 3 - inserting = /obj/item/weapon/inserted_spell/corona - - -/obj/item/weapon/inserted_spell/corona - var/evasion_reduction = 2 // We store this here because spell power may change when the spell expires. - -/obj/item/weapon/inserted_spell/corona/on_insert() - spawn(1) - if(isliving(host)) - var/mob/living/L = host - evasion_reduction = round(2 * spell_power_at_creation, 1) - L.evasion -= evasion_reduction - L.visible_message("You start to glow very brightly!") - spawn(1 MINUTE) - if(src) - on_expire() - -/obj/item/weapon/inserted_spell/corona/on_expire() - if(isliving(host)) - var/mob/living/L = host - L.evasion += evasion_reduction - L << "Your glow has ended." - ..() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/haste.dm b/code/game/gamemodes/technomancer/spells/insert/haste.dm deleted file mode 100644 index 30422cef3f..0000000000 --- a/code/game/gamemodes/technomancer/spells/insert/haste.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/technomancer/spell/haste - name = "Haste" - desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \ - runs extremly fast, and cannot be slowed by any means." - spell_power_desc = "Duration is scaled up." - cost = 100 - obj_path = /obj/item/weapon/spell/insert/haste - ability_icon_state = "tech_haste" - category = SUPPORT_SPELLS - -/obj/item/weapon/spell/insert/haste - name = "haste" - desc = "Now you can outrun a Teshari!" - icon_state = "haste" - cast_methods = CAST_RANGED - aspect = ASPECT_FORCE - light_color = "#FF5C5C" - inserting = /obj/item/weapon/inserted_spell/haste - -/obj/item/weapon/inserted_spell/haste/on_insert() - spawn(1) - if(isliving(host)) - var/mob/living/L = host - L.force_max_speed = 1 - L << "You suddenly find it much easier to move." - L.adjust_instability(10) - spawn(round(5 SECONDS * spell_power_at_creation, 1)) - if(src) - on_expire() - -/obj/item/weapon/inserted_spell/haste/on_expire() - if(isliving(host)) - var/mob/living/L = host - L.force_max_speed = 0 - L << "You feel slow again." - ..() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm deleted file mode 100644 index 38e4ef4720..0000000000 --- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/technomancer/spell/repel_missiles - name = "Repel Missiles" - desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \ - to hit you. The field lasts for five minutes and can be granted to yourself or an ally." - spell_power_desc = "Projectiles will be more likely to be deflected." - cost = 25 - obj_path = /obj/item/weapon/spell/insert/repel_missiles - ability_icon_state = "tech_repelmissiles" - category = SUPPORT_SPELLS - -/obj/item/weapon/spell/insert/repel_missiles - name = "repel missiles" - desc = "Use it before they start shooting at you!" - icon_state = "generic" - cast_methods = CAST_RANGED - aspect = ASPECT_FORCE - light_color = "#FF5C5C" - inserting = /obj/item/weapon/inserted_spell/repel_missiles - -/obj/item/weapon/inserted_spell/repel_missiles - var/evasion_increased = 2 // We store this here because spell power may change when the spell expires. - -/obj/item/weapon/inserted_spell/repel_missiles/on_insert() - spawn(1) - if(isliving(host)) - var/mob/living/L = host - evasion_increased = round(2 * spell_power_at_creation, 1) - L.evasion += evasion_increased - L << "You have a repulsion field around you, which will attempt to deflect projectiles." - spawn(5 MINUTES) - if(src) - on_expire() - -/obj/item/weapon/inserted_spell/repel_missiles/on_expire() - if(isliving(host)) - var/mob/living/L = host - L.evasion -= evasion_increased - L << "Your repulsion field has expired." - ..() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/corona.dm b/code/game/gamemodes/technomancer/spells/modifier/corona.dm new file mode 100644 index 0000000000..74a06855d9 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/corona.dm @@ -0,0 +1,33 @@ +/datum/technomancer/spell/corona + name = "Corona" + desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \ + bright glow also makes it very difficult to be stealthy. The effect lasts for one minute." + cost = 50 + obj_path = /obj/item/weapon/spell/modifier/corona + ability_icon_state = "tech_corona" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/corona + name = "corona" + desc = "How brillient!" + icon_state = "radiance" + cast_methods = CAST_RANGED + aspect = ASPECT_LIGHT + light_color = "#D9D900" + spell_light_intensity = 5 + spell_light_range = 3 + modifier_type = /datum/modifier/technomancer/corona + modifier_duration = 1 MINUTE + +/datum/modifier/technomancer/corona + name = "corona" + desc = "You appear to be glowing really bright. It doesn't seem to hurt, however hiding will be impossible." + mob_overlay_state = "corona" + + on_created_text = "You start to glow very brightly!" + on_expired_text = "Your glow has ended." + evasion = -2 + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/technomancer/corona/tick() + holder.break_cloak() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/haste.dm b/code/game/gamemodes/technomancer/spells/modifier/haste.dm new file mode 100644 index 0000000000..7f7c1045b3 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/haste.dm @@ -0,0 +1,28 @@ +/datum/technomancer/spell/haste + name = "Haste" + desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \ + runs extremly fast, and cannot be slowed by any means." + cost = 100 + obj_path = /obj/item/weapon/spell/modifier/haste + ability_icon_state = "tech_haste" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/haste + name = "haste" + desc = "Now you can outrun a Teshari!" + icon_state = "haste" + cast_methods = CAST_RANGED + aspect = ASPECT_FORCE + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/haste + modifier_duration = 5 SECONDS + +/datum/modifier/technomancer/haste + name = "haste" + desc = "Moving is almost effortless!" + mob_overlay_state = "haste" + + on_created_text = "You suddenly find it much easier to move." + on_expired_text = "You feel slow again." + haste = TRUE + stacks = MODIFIER_STACK_EXTEND \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/modifier.dm b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm new file mode 100644 index 0000000000..b0a5c93747 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/modifier.dm @@ -0,0 +1,31 @@ +/obj/item/weapon/spell/modifier + name = "modifier template" + desc = "Tell a coder if you can read this in-game." + icon_state = "purify" + cast_methods = CAST_MELEE + var/modifier_type = null + var/modifier_duration = null // Will last forever by default. Final duration may differ due to 'spell power' +// var/spell_color = "#03A728" + var/spell_light_intensity = 2 + var/spell_light_range = 3 + +/obj/item/weapon/spell/modifier/New() + ..() + set_light(spell_light_range, spell_light_intensity, l_color = light_color) + +/obj/item/weapon/spell/modifier/on_melee_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /mob/living)) + on_add_modifier(hit_atom) + +/obj/item/weapon/spell/modifier/on_ranged_cast(atom/hit_atom, mob/user) + if(istype(hit_atom, /mob/living)) + on_add_modifier(hit_atom) + + +/obj/item/weapon/spell/modifier/proc/on_add_modifier(var/mob/living/L) + var/duration = modifier_duration + if(duration) + duration = round(duration * calculate_spell_power(1.0), 1) + L.add_modifier(modifier_type, duration) + log_and_message_admins("has casted [src] on [L].") + qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm new file mode 100644 index 0000000000..d267ecce88 --- /dev/null +++ b/code/game/gamemodes/technomancer/spells/modifier/repel_missiles.dm @@ -0,0 +1,28 @@ +/datum/technomancer/spell/repel_missiles + name = "Repel Missiles" + desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \ + to hit you. The field lasts for 10 minutes and can be granted to yourself or an ally." + cost = 25 + obj_path = /obj/item/weapon/spell/modifier/repel_missiles + ability_icon_state = "tech_repelmissiles" + category = SUPPORT_SPELLS + +/obj/item/weapon/spell/modifier/repel_missiles + name = "repel missiles" + desc = "Use it before they start shooting at you!" + icon_state = "generic" + cast_methods = CAST_RANGED + aspect = ASPECT_FORCE + light_color = "#FF5C5C" + modifier_type = /datum/modifier/technomancer/repel_missiles + modifier_duration = 10 MINUTES + +/datum/modifier/technomancer/repel_missiles + name = "repel_missiles" + desc = "A repulsion field can always be useful to have." + mob_overlay_state = "repel_missiles" + + on_created_text = "You have a repulsion field around you, which will attempt to deflect projectiles." + on_expired_text = "Your repulsion field has expired." + evasion = 3 + stacks = MODIFIER_STACK_EXTEND \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/passwall.dm b/code/game/gamemodes/technomancer/spells/passwall.dm index aa16a8a4fc..e786134b4c 100644 --- a/code/game/gamemodes/technomancer/spells/passwall.dm +++ b/code/game/gamemodes/technomancer/spells/passwall.dm @@ -39,7 +39,7 @@ visible_message("[user] rests a hand on \the [hit_atom].") busy = 1 - var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, our_turf) while(i) diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index d841db2acc..60abcee63f 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -19,7 +19,7 @@ /obj/item/weapon/spell/reflect/New() ..() set_light(3, 2, l_color = "#006AFF") - spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) owner << "Your shield will expire in 3 seconds!" spawn(5 SECONDS) diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm index a9514aaa29..291c74f7fa 100644 --- a/code/game/gamemodes/technomancer/spells/shield.dm +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -21,7 +21,7 @@ /obj/item/weapon/spell/shield/New() ..() set_light(3, 2, l_color = "#006AFF") - spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) /obj/item/weapon/spell/shield/Destroy() diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index eafb167dd4..be978e7ee4 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -20,10 +20,10 @@ /obj/item/weapon/spell/spawner/darkness/New() ..() - set_light(6, -5, l_color = "#FFFFFF") + set_light(6, -20, l_color = "#FFFFFF") /obj/effect/temporary_effect/darkness name = "darkness" time_to_die = 2 MINUTES new_light_range = 6 - new_light_power = -5 \ No newline at end of file + new_light_power = -20 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index 94074ffcf0..3f8939e0ba 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -16,7 +16,7 @@ /obj/item/weapon/spell/warp_strike/New() ..() - sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(5, 0, src) sparks.attach(loc) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index e7bb56347e..5d105d6e87 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -266,6 +266,7 @@ economic_modifier = 7 access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) minimal_access = list(access_lawyer, access_sec_doors, access_heads) + minimal_player_age = 7 /datum/job/lawyer/equip(var/mob/living/carbon/human/H, var/alt_title) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 1145265bbb..15bbfdeee5 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -68,10 +68,12 @@ anchored = 1 circuit = /obj/item/weapon/circuitboard/sleeper var/mob/living/carbon/human/occupant = null - var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") + var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 var/obj/machinery/sleep_console/console + var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1) + var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0) use_power = 1 idle_power_usage = 15 @@ -98,18 +100,23 @@ /obj/machinery/sleeper/process() if(stat & (NOPOWER|BROKEN)) return + if(occupant) + occupant.Stasis(stasis_level) + if(stasis_level >= 100 && occupant.timeofdeath) + occupant.timeofdeath += 1 SECOND + + if(filtering > 0) + if(beaker) + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + var/pumped = 0 + for(var/datum/reagent/x in occupant.reagents.reagent_list) + occupant.reagents.trans_to_obj(beaker, 3) + pumped++ + if(ishuman(occupant)) + occupant.vessel.trans_to_obj(beaker, pumped + 1) + else + toggle_filter() - if(filtering > 0) - if(beaker) - if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) - var/pumped = 0 - for(var/datum/reagent/x in occupant.reagents.reagent_list) - occupant.reagents.trans_to_obj(beaker, 3) - pumped++ - if(ishuman(occupant)) - occupant.vessel.trans_to_obj(beaker, pumped + 1) - else - toggle_filter() /obj/machinery/sleeper/update_icon() icon_state = "sleeper_[occupant ? "1" : "0"]" @@ -154,6 +161,13 @@ data["beaker"] = -1 data["filtering"] = filtering + var/stasis_level_name = "Error!" + for(var/N in stasis_choices) + if(stasis_choices[N] == stasis_level) + stasis_level_name = N + break + data["stasis"] = stasis_level_name + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) ui = new(user, src, ui_key, "sleeper.tmpl", "Sleeper UI", 600, 600, state = state) @@ -182,12 +196,20 @@ if(occupant && occupant.stat != DEAD) if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"])) + if(href_list["change_stasis"]) + var/new_stasis = input("Levels deeper than 50% stasis level will render the patient unconscious.","Stasis Level") as null|anything in stasis_choices + if(new_stasis && CanUseTopic(usr, default_state) == STATUS_INTERACTIVE) + stasis_level = stasis_choices[new_stasis] return 1 /obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user) add_fingerprint(user) - if(default_deconstruction_screwdriver(user, I)) + if(istype(I, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = I + if(G.affecting) + go_in(G.affecting, user) + else if(default_deconstruction_screwdriver(user, I)) return else if(default_deconstruction_crowbar(user, I)) return @@ -201,6 +223,28 @@ user << "\The [src] has a beaker already." return +/obj/machinery/sleeper/verb/move_eject() + set name = "Eject occupant" + set category = "Object" + set src in oview(1) + if(usr == occupant) + switch(usr.stat) + if(DEAD) + return + if(UNCONSCIOUS) + usr << "You struggle through the haze to hit the eject button. This will take a couple of minutes..." + sleep(2 MINUTES) + if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already + return + go_out() + if(CONSCIOUS) + go_out() + else + if(usr.stat != 0) + return + go_out() + add_fingerprint(usr) + /obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user) if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target)) return @@ -261,6 +305,7 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE + occupant.Stasis(0) occupant.loc = src.loc occupant = null for(var/atom/movable/A in src) // In case an object was dropped inside or something diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index c3c16dd8e5..238bb95efc 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -305,6 +305,15 @@ occupantData["reagents"] = reagentData + var/ingestedData[0] + if(H.ingested.reagent_list.len >= 1) + for(var/datum/reagent/R in H.ingested.reagent_list) + ingestedData[++ingestedData.len] = list("name" = R.name, "amount" = R.volume) + else + ingestedData = null + + occupantData["ingested"] = ingestedData + var/extOrganData[0] for(var/obj/item/organ/external/E in H.organs) var/organData[0] @@ -398,7 +407,7 @@ P.info += "Time of scan: [worldtime2stationtime(world.time)]

" P.info += "[printing_text]" P.info += "

Notes:
" - P.name = "Body Scan - [href_list["name"]]" + P.name = "Body Scan - [href_list["name"]] ([worldtime2stationtime(world.time)])" printing = null printing_text = null @@ -461,9 +470,13 @@ dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)
" if(occupant.reagents) - for(var/datum/reagent/R in occupant.reagents) + for(var/datum/reagent/R in occupant.reagents.reagent_list) dat += "Reagent: [R.name], Amount: [R.volume]
" + if(occupant.ingested) + for(var/datum/reagent/R in occupant.ingested.reagent_list) + dat += "Stomach: [R.name], Amount: [R.volume]
" + dat += "
" dat += "" dat += "" diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 8041b07324..5746fb179e 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -720,9 +720,9 @@ if(href_list["atmos_unlock"]) switch(href_list["atmos_unlock"]) if("0") - alarm_area.air_doors_close() + alarm_area.firedoors_close() if("1") - alarm_area.air_doors_open() + alarm_area.firedoors_open() return 1 if(href_list["atmos_alarm"]) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 31c8fe7819..1aadf981c4 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -232,6 +232,8 @@ mob/living/proc/near_camera() return TRACKING_TERMINATE if(digitalcamo) return TRACKING_TERMINATE + if(alpha < 127) // For lings and possible future alpha-based cloaks. + return TRACKING_TERMINATE if(istype(loc,/obj/effect/dummy)) return TRACKING_TERMINATE diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 5677ec9ffc..f30199a66a 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -548,7 +548,7 @@ time_entered = world.time if(ishuman(M) && applies_stasis) var/mob/living/carbon/human/H = M - H.in_stasis = 1 + H.Stasis(1000) // Book keeping! var/turf/location = get_turf(src) @@ -616,7 +616,7 @@ set_occupant(usr) if(ishuman(usr) && applies_stasis) var/mob/living/carbon/human/H = occupant - H.in_stasis = 1 + H.Stasis(1000) icon_state = occupied_icon_state @@ -652,7 +652,7 @@ occupant.forceMove(get_turf(src)) if(ishuman(occupant) && applies_stasis) var/mob/living/carbon/human/H = occupant - H.in_stasis = 0 + H.Stasis(0) set_occupant(null) icon_state = base_icon_state diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index fa4b601e91..76eb2da2d5 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -61,7 +61,7 @@ for reference: var/health = 100 var/maxhealth = 100 var/material/material - + /obj/structure/barricade/New(var/newloc, var/material_name) ..(newloc) if(!material_name) @@ -74,7 +74,7 @@ for reference: desc = "This space is blocked off by a barricade made of [material.display_name]." color = material.icon_colour maxhealth = material.integrity - health = maxhealth + health = maxhealth /obj/structure/barricade/get_material() return material @@ -237,7 +237,7 @@ for reference: var/turf/Tsec = get_turf(src) /* var/obj/item/stack/rods/ =*/ - PoolOrNew(/obj/item/stack/rods, Tsec) + new /obj/item/stack/rods(Tsec) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b76a7b71cc..f3a0fd68f0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -839,7 +839,7 @@ About the new airlock wires panel: src.welded = 1 else src.welded = null - playsound(src, 'sound/items/Welder.ogg', 100, 1) + playsound(src, 'sound/items/Welder.ogg', 75, 1) src.update_icon() return else @@ -864,7 +864,7 @@ About the new airlock wires panel: cable.plugin(src, user) else if(!repairing && istype(C, /obj/item/weapon/crowbar)) if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) ) - playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) + playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) to_chat(user,"You removed the airlock electronics!") @@ -957,9 +957,9 @@ About the new airlock wires panel: //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator if(arePowerSystemsOn()) - playsound(src.loc, open_sound_powered, 100, 1) + playsound(src.loc, open_sound_powered, 75, 1) else - playsound(src.loc, open_sound_unpowered, 100, 1) + playsound(src.loc, open_sound_unpowered, 75, 1) if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) src.closeOther.close() @@ -1054,9 +1054,9 @@ About the new airlock wires panel: use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people has_beeped = 0 if(arePowerSystemsOn()) - playsound(src.loc, open_sound_powered, 100, 1) + playsound(src.loc, open_sound_powered, 75, 1) else - playsound(src.loc, open_sound_unpowered, 100, 1) + playsound(src.loc, open_sound_unpowered, 75, 1) for(var/turf/turf in locs) var/obj/structure/window/killthis = (locate(/obj/structure/window) in turf) if(killthis) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 569395cd2c..20356c1a5f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -164,7 +164,7 @@ switch (Proj.damage_type) if(BRUTE) new /obj/item/stack/material/steel(src.loc, 2) - PoolOrNew(/obj/item/stack/rods, list(src.loc, 3)) + new /obj/item/stack/rods(src.loc, 3) if(BURN) new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! qdel(src) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index cbdcfb9f2f..1162264dd7 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -141,7 +141,7 @@ var/alarmed = lockdown for(var/area/A in areas_added) //Checks if there are fire alarms in any areas associated with that firedoor - if(A.fire || A.air_doors_activated) + if(A.firedoors_closed) alarmed = 1 var/answer = alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\ @@ -179,7 +179,7 @@ spawn(50) alarmed = 0 for(var/area/A in areas_added) //Just in case a fire alarm is turned off while the firedoor is going through an autoclose cycle - if(A.fire || A.air_doors_activated) + if(A.firedoors_closed) alarmed = 1 if(alarmed) nextstate = FIREDOOR_CLOSED diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker.dm b/code/game/machinery/kitchen/cooking_machines/_cooker.dm index a6af0f13f2..552e05d95a 100644 --- a/code/game/machinery/kitchen/cooking_machines/_cooker.dm +++ b/code/game/machinery/kitchen/cooking_machines/_cooker.dm @@ -170,7 +170,7 @@ cooking_obj = new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src) // Produce nasty smoke. visible_message("\The [src] vomits a gout of rancid smoke!") - var/datum/effect/effect/system/smoke_spread/bad/smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) + var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() smoke.attach(src) smoke.set_up(10, 0, usr.loc) smoke.start() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index b0946bf347..6e9f31889d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -155,7 +155,7 @@ Class Procs: if(use_power && stat == 0) use_power(7500/severity) - var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc) + var/obj/effect/overlay/pulse2 = new /obj/effect/overlay(src.loc) pulse2.icon = 'icons/effects/effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 595712afd3..6d7a6f82a7 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -567,7 +567,7 @@ var/list/turret_icons set_raised_raising(raised, 1) update_icon() - var/atom/flick_holder = PoolOrNew(/atom/movable/porta_turret_cover, loc) + var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc) flick_holder.layer = layer + 0.1 flick("popup", flick_holder) sleep(10) @@ -588,7 +588,7 @@ var/list/turret_icons set_raised_raising(raised, 1) update_icon() - var/atom/flick_holder = PoolOrNew(/atom/movable/porta_turret_cover, loc) + var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc) flick_holder.layer = layer + 0.1 flick("popdown", flick_holder) sleep(10) diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index d28b426890..e7541bc5b1 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -7,7 +7,7 @@ products += list(/obj/item/weapon/gun/energy/taser = 8,/obj/item/weapon/gun/energy/stunrevolver = 4, /obj/item/weapon/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6, /obj/item/weapon/gun/projectile/sec/flash = 4, /obj/item/ammo_magazine/c45m/flash = 8, - /obj/item/clothing/glasses/omnihud/sec = 4) + /obj/item/clothing/glasses/omnihud/sec = 6) ..() /obj/machinery/vending/tool/New() @@ -15,12 +15,12 @@ ..() /obj/machinery/vending/engivend/New() - products += list(/obj/item/clothing/glasses/omnihud/eng = 4) + products += list(/obj/item/clothing/glasses/omnihud/eng = 6) ..() /obj/machinery/vending/medical/New() products += list(/obj/item/weapon/storage/box/khcrystal = 4,/obj/item/weapon/backup_implanter = 3, - /obj/item/clothing/glasses/omnihud/med = 2, /obj/item/device/glasses_kit = 1) + /obj/item/clothing/glasses/omnihud/med = 4, /obj/item/device/glasses_kit = 1) ..() //Custom vendors diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index ffe30bf3fd..1e10e03f4f 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -7,7 +7,7 @@ energy_drain = 20 range = MELEE equip_cooldown = 50 - var/mob/living/carbon/occupant = null + var/mob/living/carbon/human/occupant = null var/datum/global_iterator/pr_mech_sleeper var/inject_amount = 10 required_type = /obj/mecha/medical @@ -28,7 +28,7 @@ Exit(atom/movable/O) return 0 - action(var/mob/living/carbon/target) + action(var/mob/living/carbon/human/target) if(!action_checks(target)) return if(!istype(target)) @@ -56,6 +56,7 @@ target.forceMove(src) occupant = target target.reset_view(src) + occupant.Stasis(3) /* if(target.client) target.client.perspective = EYE_PERSPECTIVE @@ -80,6 +81,7 @@ occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE */ + occupant.Stasis(0) occupant = null pr_mech_sleeper.stop() set_ready_state(1) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 41f1ba44ef..9b2e0aa26d 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -208,7 +208,7 @@ for(var/a = 1 to 5) spawn(0) - var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(chassis)) + var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis)) var/turf/my_target if(a == 1) my_target = T diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm index c1ef53a59d..b7892c32c7 100644 --- a/code/game/mecha/micro/micro_equipment.dm +++ b/code/game/mecha/micro/micro_equipment.dm @@ -197,25 +197,25 @@ set src in view(1) if(!istype(usr, /mob/living/carbon/human)) //Only living, intelligent creatures with hands can empty ore boxes. - usr << "\red You are physically incapable of emptying the ore box." + to_chat(usr, "You are physically incapable of emptying the ore box.") return if( usr.stat || usr.restrained() ) return if(!Adjacent(usr)) //You can only empty the box if you can physically reach it - usr << "You cannot reach the ore box." + to_chat(usr, "You cannot reach the ore box.") return add_fingerprint(usr) if(contents.len < 1) - usr << "\red The ore box is empty" + to_chat(usr, "The ore box is empty") return for (var/obj/item/weapon/ore/O in contents) contents -= O O.loc = src.loc - usr << "\blue You empty the ore box" + to_chat(usr, "You empty the ore box") return diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 3f077116e9..45cfcc8348 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -152,7 +152,7 @@ if(passed_smoke) smoke = passed_smoke else - smoke = PoolOrNew(/obj/effect/effect/smoke/chem, location) + smoke = new /obj/effect/effect/smoke/chem(location) if(chemholder.reagents.reagent_list.len) chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents @@ -169,7 +169,7 @@ qdel(src) /datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1) - var/obj/effect/effect/smoke/chem/spores = PoolOrNew(/obj/effect/effect/smoke/chem, location) + var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location) spores.name = "cloud of [seed.seed_name] [seed.seed_noun]" ..(T, I, dist, spores) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index b29b2440e6..5f29bd6448 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -108,7 +108,7 @@ F.amount += amount return - F = PoolOrNew(/obj/effect/effect/foam, list(location, metal)) + F = new /obj/effect/effect/foam(location, metal) F.amount = amount if(!metal) // don't carry other chemicals if a metal foam diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index fc764efd02..3cdca23fde 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -222,7 +222,7 @@ var/global/list/image/splatter_cache=list() for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if (i > 0) - var/obj/effect/decal/cleanable/blood/b = PoolOrNew(/obj/effect/decal/cleanable/blood/splatter, src.loc) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(src.loc) b.basecolor = src.basecolor b.update_icon() diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 485ea6987b..2343871b95 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -75,7 +75,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/steam/steam = PoolOrNew(/obj/effect/effect/steam, src.location) + var/obj/effect/effect/steam/steam = new /obj/effect/effect/steam(src.location) var/direction if(src.cardinals) direction = pick(cardinal) @@ -146,7 +146,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/sparks/sparks = PoolOrNew(/obj/effect/effect/sparks, src.location) + var/obj/effect/effect/sparks/sparks = new /obj/effect/effect/sparks(src.location) src.total_sparks++ var/direction if(src.cardinals) @@ -283,7 +283,7 @@ steam.start() -- spawns the effect spawn(0) if(holder) src.location = get_turf(holder) - var/obj/effect/effect/smoke/smoke = PoolOrNew(smoke_type, src.location) + var/obj/effect/effect/smoke/smoke = new smoke_type(src.location) src.total_smoke++ smoke.color = I var/direction = src.direction @@ -334,7 +334,7 @@ steam.start() -- spawns the effect var/turf/T = get_turf(src.holder) if(T != src.oldposition) if(isturf(T)) - var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition) + var/obj/effect/effect/ion_trails/I = new /obj/effect/effect/ion_trails(src.oldposition) src.oldposition = T I.set_dir(src.holder.dir) flick("ion_fade", I) @@ -380,7 +380,7 @@ steam.start() -- spawns the effect src.processing = 0 spawn(0) if(src.number < 3) - var/obj/effect/effect/steam/I = PoolOrNew(/obj/effect/effect/steam, src.oldposition) + var/obj/effect/effect/steam/I = new /obj/effect/effect/steam(src.oldposition) src.number++ src.oldposition = get_turf(holder) I.set_dir(src.holder.dir) @@ -420,7 +420,7 @@ steam.start() -- spawns the effect start() if (amount <= 2) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(2, 1, location) s.start() diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 9d630113bb..16db09edb6 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -24,7 +24,7 @@ var/obj/effect/decal/cleanable/blood/gibs/gib = null if(sparks) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(2, 1, get_turf(location)) // Not sure if it's safe to pass an arbitrary object to set_up, todo s.start() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 27e6d7c74a..52f920775e 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -26,7 +26,7 @@ call(src,triggerproc)(M) /obj/effect/mine/proc/triggerrad(obj) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(3, 1, src) s.start() obj:radiation += 50 @@ -39,7 +39,7 @@ if(ismob(obj)) var/mob/M = obj M.Stun(30) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(3, 1, src) s.start() spawn(0) @@ -67,7 +67,7 @@ qdel(src) /obj/effect/mine/proc/triggerkick(obj) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(3, 1, src) s.start() qdel(obj:client) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 1077d757ae..4396465bc9 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -105,7 +105,7 @@ O = loc for(var/i=0, i[src] dies!") - PoolOrNew(/obj/effect/decal/cleanable/spiderling_remains, src.loc) + new /obj/effect/decal/cleanable/spiderling_remains(src.loc) qdel(src) /obj/effect/spider/spiderling/healthcheck() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 3b1a3b54f5..3d97946bd4 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -15,7 +15,7 @@ proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_rang log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ") if(first_range > 1) - var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter) + var/obj/effect/overlay/pulse = new /obj/effect/overlay(epicenter) pulse.icon = 'icons/effects/effects.dmi' pulse.icon_state = "emppulse" pulse.name = "emp pulse" diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index dd18925da2..0bf146f037 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -44,6 +44,16 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) + 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)) + // check if the mob can hear + if(M.ear_deaf <= 0 || !M.ear_deaf) + if(!istype(M.loc,/turf/space)) + M << 'sound/effects/explosionfar.ogg' + if(adminlog) message_admins("Explosion with [shaped ? "shaped" : "non-shaped"] 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 [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") @@ -80,8 +90,8 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa var/atom/movable/AM = atom_movable if(AM && AM.simulated) AM.ex_act(dist) - T.ex_act(dist) - + T.ex_act(dist) + var/took = (world.timeofday-start)/10 //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds." diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4316da3c49..de91b79d60 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -50,7 +50,7 @@ var/zoomdevicename = null //name used for message when binoculars/scope is used var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars. - var/embed_chance = -1 //-1 makes it calculate embed chance, 0 won't embed, and 100 will always embed + var/embed_chance = -1 //0 won't embed, and 100 will always embed var/icon_override = null //Used to override hardcoded clothing dmis in human clothing proc. @@ -79,12 +79,12 @@ var/list/sprite_sheets_obj = list() /obj/item/New() - if(embed_chance == -1) - if(sharp) - embed_chance = force/w_class - else - embed_chance = force/(w_class*3) ..() + if(embed_chance < 0) + if(sharp) + embed_chance = max(5, round(force/w_class)) + else + embed_chance = max(5, round(force/(w_class*3))) /obj/item/equipped() ..() diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index b4ba67e4c2..4d77da4ae9 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -77,14 +77,14 @@ /obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location) ..() if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) - if(!ishuman(usr)) return + if(!ishuman(usr)) return 0 if(opened) return 0 if(contents.len) return 0 visible_message("[usr] folds up the [src.name]") - new item_path(get_turf(src)) + var/folded = new item_path(get_turf(src)) spawn(0) qdel(src) - return + return folded /obj/structure/closet/body_bag/relaymove(mob/user,direction) if(src.loc != get_turf(src)) @@ -115,34 +115,43 @@ /obj/item/bodybag/cryobag name = "stasis bag" - desc = "A folded, non-reusable bag designed to prevent additional damage to an occupant, especially useful if short on time or in \ - a hostile enviroment." + desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \ + especially useful if short on time or in a hostile enviroment." icon = 'icons/obj/cryobag.dmi' icon_state = "bodybag_folded" item_state = "bodybag_cryo_folded" origin_tech = list(TECH_BIO = 4) + var/obj/item/weapon/reagent_containers/syringe/syringe /obj/item/bodybag/cryobag/attack_self(mob/user) var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc) R.add_fingerprint(user) + if(syringe) + R.syringe = syringe + syringe = null qdel(src) /obj/structure/closet/body_bag/cryobag name = "stasis bag" - desc = "A non-reusable plastic bag designed to prevent additional damage to an occupant, especially useful if short on time or in \ - a hostile enviroment." + desc = "A non-reusable plastic bag designed to slow down bodily functions such as circulation and breathing, \ + especially useful if short on time or in a hostile enviroment." icon = 'icons/obj/cryobag.dmi' item_path = /obj/item/bodybag/cryobag store_misc = 0 store_items = 0 var/used = 0 var/obj/item/weapon/tank/tank = null + var/stasis_level = 3 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1) + var/obj/item/weapon/reagent_containers/syringe/syringe /obj/structure/closet/body_bag/cryobag/New() tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened. ..() /obj/structure/closet/body_bag/cryobag/Destroy() + if(syringe) + qdel(syringe) + syringe = null qdel(tank) tank = null ..() @@ -157,11 +166,19 @@ O.desc = "Pretty useless now.." qdel(src) +/obj/structure/closet/body_bag/cryobag/MouseDrop(over_object, src_location, over_location) + . = ..() + if(. && syringe) + var/obj/item/bodybag/cryobag/folded = . + folded.syringe = syringe + syringe = null + /obj/structure/closet/body_bag/cryobag/Entered(atom/movable/AM) if(ishuman(AM)) var/mob/living/carbon/human/H = AM - H.in_stasis = 1 + H.Stasis(stasis_level) src.used = 1 + inject_occupant(H) if(istype(AM, /obj/item/organ)) var/obj/item/organ/O = AM @@ -173,7 +190,7 @@ /obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM) if(ishuman(AM)) var/mob/living/carbon/human/H = AM - H.in_stasis = 0 + H.Stasis(0) if(istype(AM, /obj/item/organ)) var/obj/item/organ/O = AM @@ -187,10 +204,19 @@ return tank.air_contents ..() +/obj/structure/closet/body_bag/cryobag/proc/inject_occupant(var/mob/living/carbon/human/H) + if(!syringe) + return + + if(H.reagents) + syringe.reagents.trans_to_mob(H, 30, CHEM_BLOOD) + /obj/structure/closet/body_bag/cryobag/examine(mob/user) ..() if(Adjacent(user)) //The bag's rather thick and opaque from a distance. user << "You peer into \the [src]." + if(syringe) + user << "It has a syringe added to it." for(var/mob/living/L in contents) L.examine(user) @@ -202,5 +228,28 @@ var/obj/item/device/healthanalyzer/analyzer = W for(var/mob/living/L in contents) analyzer.attack(L,user) + + else if(istype(W,/obj/item/weapon/reagent_containers/syringe)) + if(syringe) + to_chat(user,"\The [src] already has an injector! Remove it first.") + else + var/obj/item/weapon/reagent_containers/syringe/syringe = W + to_chat(user,"You insert \the [syringe] into \the [src], and it locks into place.") + user.unEquip(syringe) + src.syringe = syringe + syringe.loc = null + for(var/mob/living/carbon/human/H in contents) + inject_occupant(H) + break + + else if(istype(W,/obj/item/weapon/screwdriver)) + if(syringe) + if(used) + to_chat(user,"The injector cannot be removed now that the stasis bag has been used!") + else + syringe.forceMove(src.loc) + to_chat(user,"You pry \the [syringe] out of \the [src].") + syringe = null + else ..() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 47642603f7..3b0b74ff01 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1105,6 +1105,8 @@ var/global/list/obj/item/device/pda/PDAs = list() if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice if(istype(M, /mob/new_player)) continue + if(M.forbid_seeing_deadchat) + continue M.show_message("PDA Message - [owner] -> [P.owner]: [t]") if(!conversations.Find("\ref[P]")) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 4b870481fa..9775d64042 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -47,7 +47,7 @@ qdel(active_dummy) active_dummy = null usr << "You deactivate the [src]." - var/obj/effect/overlay/T = PoolOrNew(/obj/effect/overlay, get_turf(src)) + var/obj/effect/overlay/T = new /obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) spawn(8) qdel(T) @@ -55,7 +55,7 @@ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) var/obj/O = new saved_item(src) if(!O) return - var/obj/effect/dummy/chameleon/C = PoolOrNew(/obj/effect/dummy/chameleon, usr.loc) + var/obj/effect/dummy/chameleon/C = new /obj/effect/dummy/chameleon(usr.loc) C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, src) qdel(O) usr << "You activate the [src]." diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 805bd25046..ba4256830a 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -212,6 +212,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() alert_called = 0 update_icon() ui_interact(user) + if(video_source) + watch_video(user) // Proc: MouseDrop() //Same thing PDAs do @@ -1041,7 +1043,8 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(!Adjacent(user) || !video_source) return user.set_machine(video_source) user.reset_view(video_source) - user << "Now viewing video session. To leave camera view: OOC -> Cancel Camera View" + to_chat(user,"Now viewing video session. To leave camera view, close the communicator window OR: OOC -> Cancel Camera View") + to_chat(user,"To return to an active video session, use the communicator in your hand.") spawn(0) while(user.machine == video_source && (Adjacent(user) || loc == user)) var/turf/T = get_turf(video_source) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 15f3310322..db4e890d60 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -155,7 +155,7 @@ singular_name = "advanced trauma kit" desc = "An advanced trauma kit for severe injuries." icon_state = "traumakit" - heal_brute = 0 + heal_brute = 5 origin_tech = list(TECH_BIO = 1) /obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob) @@ -213,7 +213,7 @@ singular_name = "advanced burn kit" desc = "An advanced treatment kit for severe burns." icon_state = "burnkit" - heal_burn = 0 + heal_burn = 5 origin_tech = list(TECH_BIO = 1) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm deleted file mode 100644 index 9099ff3bd1..0000000000 --- a/code/game/objects/items/weapons/dice.dm +++ /dev/null @@ -1,59 +0,0 @@ -/obj/item/weapon/dice - name = "d6" - desc = "A dice with six sides." - icon = 'icons/obj/dice.dmi' - icon_state = "d66" - w_class = ITEMSIZE_TINY - var/sides = 6 - attack_verb = list("diced") - -/obj/item/weapon/dice/New() - icon_state = "[name][rand(1,sides)]" - -/obj/item/weapon/dice/d4 - name = "d4" - desc = "A dice with four sides." - icon_state = "d44" - sides = 4 - -/obj/item/weapon/dice/d8 - name = "d8" - desc = "A dice with eight sides." - icon_state = "d88" - sides = 8 - -/obj/item/weapon/dice/d10 - name = "d10" - desc = "A dice with ten sides." - icon_state = "d1010" - sides = 10 - -/obj/item/weapon/dice/d12 - name = "d12" - desc = "A dice with twelve sides." - icon_state = "d1212" - sides = 12 - -/obj/item/weapon/dice/d20 - name = "d20" - desc = "A dice with twenty sides." - icon_state = "d2020" - sides = 20 - -/obj/item/weapon/dice/d100 - name = "d100" - desc = "A dice with ten sides. This one is for the tens digit." - icon_state = "d10010" - sides = 10 - -/obj/item/weapon/dice/attack_self(mob/user as mob) - var/result = rand(1, sides) - var/comment = "" - if(sides == 20 && result == 20) - comment = "Nat 20!" - else if(sides == 20 && result == 1) - comment = "Ouch, bad luck." - icon_state = "[name][result]" - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ - "You throw [src]. It lands on a [result]. [comment]", \ - "You hear [src] landing on a [result]. [comment]") diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 3bcb68bcee..eba48464f0 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -107,7 +107,7 @@ spawn(0) if(!src || !reagents.total_volume) return - var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src)) + var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(src)) var/turf/my_target if(a <= the_targets.len) my_target = the_targets[a] diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index c3f93a016f..84bee72558 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -86,7 +86,7 @@ if(ptank) ptank.loc = T ptank = null - PoolOrNew(/obj/item/stack/rods, T) + new /obj/item/stack/rods(T) qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index d64627fcf3..2c89be0ac7 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -12,7 +12,7 @@ /obj/item/weapon/grenade/smokebomb/New() ..() - src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) + src.smoke = new /datum/effect/effect/system/smoke_spread/bad() src.smoke.attach(src) /obj/item/weapon/grenade/smokebomb/Destroy() diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 1190d7f812..62941c24f0 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -41,6 +41,8 @@ user << "You need to have a firm grip on [C] before you can put \the [src] on!" /obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user) + if(user == target) + return 1 if(istype(user, /mob/living/silicon/robot)) if(user.Adjacent(target)) return 1 diff --git a/code/game/objects/items/weapons/implants/implantreagent_vr.dm b/code/game/objects/items/weapons/implants/implantreagent_vr.dm new file mode 100644 index 0000000000..615b74ff49 --- /dev/null +++ b/code/game/objects/items/weapons/implants/implantreagent_vr.dm @@ -0,0 +1,96 @@ +/obj/item/weapon/implant/reagent_generator + name = "reagent generator implant" + desc = "This is an implant that has attached storage and generates a reagent." + implant_color = "r" + var/datum/reagent/generated_reagent = null + var/gen_amount = 2 //amount of reagent generated per process tick + var/gen_cost = 0.5 //amount of nutrient taken from the host per process tick + var/transfer_amount = 30 //amount transferred when using verb + var/usable_volume = 120 + + var/list/empty_message = list("You feel as though your internal reagent implant is almost empty.") + var/list/full_message = "You feel as though your internal reagent implant is full." + var/list/emote_descriptor = list("tranfers something") //In format of [x] [emote_descriptor] into [container] + var/list/self_emote_descriptor = list("transfer") //In format of You [self_emote_descriptor] some [generated_reagent] into [container] + var/list/random_emote = list() //An emote the person with the implant may be forced to perform after a prob check, such as [X] meows. + var/assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant + +/obj/item/weapon/implant/reagent_generator/New() + ..() + create_reagents(usable_volume) + +/obj/item/weapon/implanter/reagent_generator + var/implant_type = /obj/item/weapon/implant/reagent_generator + +/obj/item/weapon/implanter/reagent_generator/New() + ..() + imp = new implant_type(src) + update() + return + +/obj/item/weapon/implant/reagent_generator/implanted(mob/living/carbon/source) + processing_objects += src + to_chat(source, "You implant [source] with \the [src].") + source.verbs |= assigned_proc + return 1 + +/obj/item/weapon/implant/reagent_generator/process() + var/before_gen + if(imp_in && generated_reagent) + before_gen = reagents.total_volume + if(reagents.total_volume < reagents.maximum_volume) + if(imp_in.nutrition >= gen_cost) + do_generation() + else + return + else + imp_in.verbs -= assigned_proc + return + + if(reagents) + if(reagents.total_volume == reagents.maximum_volume * 0.05) + to_chat(imp_in, "[pick(empty_message)]") + else if(reagents.total_volume == reagents.maximum_volume && before_gen < reagents.maximum_volume) + to_chat(imp_in, "[pick(full_message)]") + +/obj/item/weapon/implant/reagent_generator/proc/do_generation() + imp_in.nutrition -= gen_cost + reagents.add_reagent(generated_reagent, gen_amount) + +/mob/living/carbon/human/proc/use_reagent_implant() + set name = "Transfer From Reagent Implant" + set desc = "Remove reagents from am internal reagent into a container." + set category = "Object" + set src in view(1) + + do_reagent_implant(usr) + +/mob/living/carbon/human/proc/do_reagent_implant(var/mob/living/carbon/human/user = usr) + if(!isliving(user) || !user.canClick()) + return + + if(user.incapacitated() || user.stat > CONSCIOUS) + return + + var/obj/item/weapon/reagent_containers/container = user.get_active_hand() + if(!container) + to_chat(user,"You need an open container to do this!") + return + + + var/obj/item/weapon/implant/reagent_generator/rimplant + for(var/I in src.contents) + if(istype(I, /obj/item/weapon/implant/reagent_generator)) + rimplant = I + break + if(rimplant) + if(container.reagents.total_volume < container.volume) + var/container_name = container.name + if(rimplant.reagents.trans_to(container, amount = rimplant.transfer_amount)) + user.visible_message("[usr] [pick(rimplant.emote_descriptor)] into \the [container_name].", + "You [pick(rimplant.self_emote_descriptor)] some [rimplant.generated_reagent] into \the [container_name].") + if(prob(5)) + src.visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem. + if(rimplant.reagents.total_volume == rimplant.reagents.maximum_volume * 0.05) + to_chat(src, "[pick(rimplant.empty_message)]") + diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 2c47c8ab9d..5e3c96c8a0 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -130,7 +130,7 @@ . = ..() if(.) - var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 61a9a99f96..3ceb940bbb 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -126,7 +126,7 @@ new /obj/item/weapon/storage/pill_bottle/dylovene(src) new /obj/item/weapon/storage/pill_bottle/tramadol(src) new /obj/item/weapon/storage/pill_bottle/spaceacillin(src) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src) + new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src) new /obj/item/stack/medical/splint(src) return @@ -161,7 +161,7 @@ if (empty) return for(var/i = 1 to 8) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting(src) + new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src) return /* diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index bf4856501a..64952046a5 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -1,30 +1,3 @@ -/obj/item/weapon/storage/pill_bottle/dice //7d6 - name = "bag of dice" - desc = "It's a small bag with dice inside." - icon = 'icons/obj/dice.dmi' - icon_state = "dicebag" - -/obj/item/weapon/storage/pill_bottle/dice/New() - ..() - for(var/i = 1 to 7) - new /obj/item/weapon/dice( src ) - -/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice - name = "bag of gaming dice" - desc = "It's a small bag with gaming dice inside." - icon = 'icons/obj/dice.dmi' - icon_state = "magicdicebag" - -/obj/item/weapon/storage/pill_bottle/dice_nerd/New() - ..() - new /obj/item/weapon/dice/d4( src ) - new /obj/item/weapon/dice( src ) - new /obj/item/weapon/dice/d8( src ) - new /obj/item/weapon/dice/d10( src ) - new /obj/item/weapon/dice/d12( src ) - new /obj/item/weapon/dice/d20( src ) - new /obj/item/weapon/dice/d100( src ) - /* * Donut Box */ diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index c93f68a82a..25d0e576ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -28,6 +28,7 @@ new /obj/item/clothing/under/sl_suit(src) new /obj/item/clothing/under/rank/bartender(src) new /obj/item/clothing/under/rank/bartender(src) + new /obj/item/clothing/under/rank/bartender/skirt(src) new /obj/item/clothing/under/dress/dress_saloon(src) new /obj/item/clothing/accessory/wcoat(src) new /obj/item/clothing/accessory/wcoat(src) @@ -97,16 +98,24 @@ new /obj/item/clothing/under/lawyer/female(src) new /obj/item/clothing/under/lawyer/black(src) new /obj/item/clothing/under/lawyer/black(src) + new /obj/item/clothing/under/lawyer/black/skirt(src) + new /obj/item/clothing/under/lawyer/black/skirt(src) new /obj/item/clothing/under/lawyer/red(src) new /obj/item/clothing/under/lawyer/red(src) + new /obj/item/clothing/under/lawyer/red/skirt(src) + new /obj/item/clothing/under/lawyer/red/skirt(src) new /obj/item/clothing/suit/storage/toggle/internalaffairs(src) new /obj/item/clothing/suit/storage/toggle/internalaffairs(src) new /obj/item/clothing/under/lawyer/bluesuit(src) new /obj/item/clothing/under/lawyer/bluesuit(src) + new /obj/item/clothing/under/lawyer/bluesuit/skirt(src) + new /obj/item/clothing/under/lawyer/bluesuit/skirt(src) new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src) new /obj/item/clothing/suit/storage/toggle/lawyer/bluejacket(src) new /obj/item/clothing/under/lawyer/purpsuit(src) new /obj/item/clothing/under/lawyer/purpsuit(src) + new /obj/item/clothing/under/lawyer/purpsuit/skirt(src) + new /obj/item/clothing/under/lawyer/purpsuit/skirt(src) new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src) new /obj/item/clothing/suit/storage/toggle/lawyer/purpjacket(src) new /obj/item/clothing/shoes/brown(src) @@ -119,5 +128,7 @@ new /obj/item/clothing/glasses/sunglasses/big(src) new /obj/item/clothing/under/lawyer/blue(src) new /obj/item/clothing/under/lawyer/blue(src) + new /obj/item/clothing/under/lawyer/blue/skirt(src) + new /obj/item/clothing/under/lawyer/blue/skirt(src) new /obj/item/device/tape/random(src) new /obj/item/device/tape/random(src) \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2bfbe7fe67..b535454c7c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -65,7 +65,9 @@ new /obj/item/clothing/under/dress/dress_hr(src) new /obj/item/clothing/under/lawyer/female(src) new /obj/item/clothing/under/lawyer/black(src) + new /obj/item/clothing/under/lawyer/black/skirt(src) new /obj/item/clothing/under/lawyer/red(src) + new /obj/item/clothing/under/lawyer/red/skirt(src) new /obj/item/clothing/under/lawyer/oldman(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/clothing/shoes/black(src) @@ -74,6 +76,7 @@ new /obj/item/clothing/under/rank/head_of_personnel_whimsy(src) new /obj/item/clothing/head/caphat/hop(src) new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit(src) + new /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt(src) new /obj/item/clothing/glasses/sunglasses(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 8b7f981d2e..1fb35bc3cb 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -82,6 +82,7 @@ new /obj/item/clothing/under/det/grey/waistcoat(src) new /obj/item/clothing/under/det/black(src) new /obj/item/clothing/under/det/black(src) + new /obj/item/clothing/under/det/skirt(src) new /obj/item/clothing/under/det/corporate(src) new /obj/item/clothing/under/det/corporate(src) new /obj/item/clothing/suit/storage/det_trench(src) @@ -600,17 +601,25 @@ ..() new /obj/item/clothing/under/assistantformal(src) new /obj/item/clothing/under/suit_jacket/charcoal(src) + new /obj/item/clothing/under/suit_jacket/charcoal/skirt(src) new /obj/item/clothing/under/suit_jacket/navy(src) + new /obj/item/clothing/under/suit_jacket/navy/skirt(src) new /obj/item/clothing/under/suit_jacket/burgundy(src) + new /obj/item/clothing/under/suit_jacket/burgundy/skirt(src) new /obj/item/clothing/under/suit_jacket/checkered(src) + new /obj/item/clothing/under/suit_jacket/checkered/skirt(src) new /obj/item/clothing/under/suit_jacket/tan(src) + new /obj/item/clothing/under/suit_jacket/tan/skirt(src) new /obj/item/clothing/under/sl_suit(src) new /obj/item/clothing/under/suit_jacket(src) new /obj/item/clothing/under/suit_jacket/female(src) new /obj/item/clothing/under/suit_jacket/female/skirt(src) new /obj/item/clothing/under/suit_jacket/really_black(src) + new /obj/item/clothing/under/suit_jacket/really_black/skirt(src) new /obj/item/clothing/under/suit_jacket/red(src) + new /obj/item/clothing/under/suit_jacket/red/skirt(src) new /obj/item/clothing/under/scratch(src) + new /obj/item/clothing/under/scratch/skirt(src) new /obj/item/weapon/storage/backpack/satchel(src) new /obj/item/weapon/storage/backpack/satchel(src) return @@ -637,5 +646,6 @@ new /obj/item/clothing/suit/storage/hooded/wintercoat/captain(src) new /obj/item/clothing/head/beret/centcom/captain(src) new /obj/item/clothing/under/gimmick/rank/captain/suit(src) + new /obj/item/clothing/under/gimmick/rank/captain/suit/skirt(src) new /obj/item/clothing/glasses/sunglasses(src) return diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 0691d3d68e..720d8a92d3 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -97,7 +97,7 @@ if(iswirecutter(W)) if(!shock(user, 100)) playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1) - PoolOrNew(/obj/item/stack/rods, list(get_turf(src), destroyed ? 1 : 2)) + new /obj/item/stack/rods(get_turf(src), destroyed ? 1 : 2) qdel(src) else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored)) if(!shock(user, 90)) @@ -152,7 +152,7 @@ else if(!(W.flags & CONDUCT) || !shock(user, 70)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(src) + user.do_attack_animation(src) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) switch(W.damtype) if("fire") @@ -170,11 +170,11 @@ density = 0 destroyed = 1 update_icon() - PoolOrNew(/obj/item/stack/rods, get_turf(src)) + new /obj/item/stack/rods(get_turf(src)) else if(health <= -6) - PoolOrNew(/obj/item/stack/rods, get_turf(src)) + new /obj/item/stack/rods(get_turf(src)) qdel(src) return return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index cd39971e6e..424c0ec997 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -65,7 +65,7 @@ if(WT.welding == 1) if(WT.remove_fuel(0, user)) user << "Slicing lattice joints ..." - PoolOrNew(/obj/item/stack/rods, src.loc) + new /obj/item/stack/rods(src.loc) qdel(src) return if (istype(C, /obj/item/stack/rods)) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index a382858c54..94aa30c24d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -182,13 +182,13 @@ spawn(50) if(src && on) ismist = 1 - mymist = PoolOrNew(/obj/effect/mist,loc) + mymist = new /obj/effect/mist(loc) else ismist = 1 - mymist = PoolOrNew(/obj/effect/mist,loc) + mymist = new /obj/effect/mist(loc) else if(ismist) ismist = 1 - mymist = PoolOrNew(/obj/effect/mist,loc) + mymist = new /obj/effect/mist(loc) spawn(250) if(src && !on) qdel(mymist) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 15d6e32213..809dd008a4 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -92,11 +92,11 @@ index = 0 while(index < 2) new shardtype(loc) //todo pooling? - if(reinf) PoolOrNew(/obj/item/stack/rods, loc) + if(reinf) new /obj/item/stack/rods(loc) index++ else new shardtype(loc) //todo pooling? - if(reinf) PoolOrNew(/obj/item/stack/rods, loc) + if(reinf) new /obj/item/stack/rods(loc) qdel(src) return diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index 7cdf301f6c..d0db6e7f08 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -35,7 +35,7 @@ /obj/effect/wingrille_spawn/proc/activate() if(activated) return if (!locate(/obj/structure/grille) in get_turf(src)) - var/obj/structure/grille/G = PoolOrNew(/obj/structure/grille, src.loc) + var/obj/structure/grille/G = new /obj/structure/grille(src.loc) handle_grille_spawn(G) var/list/neighbours = list() for (var/dir in cardinal) @@ -49,7 +49,7 @@ found_connection = 1 qdel(W) if(!found_connection) - var/obj/structure/window/new_win = PoolOrNew(win_path, src.loc) + var/obj/structure/window/new_win = new win_path(src.loc) new_win.set_dir(dir) handle_window_spawn(new_win) else diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm index 16b1d03d21..558f638588 100644 --- a/code/game/turfs/initialization/maintenance.dm +++ b/code/game/turfs/initialization/maintenance.dm @@ -15,9 +15,10 @@ T.update_dirt() if(prob(2)) - PoolOrNew(junk(), T) + var/type = junk() + new type(T) if(prob(2)) - PoolOrNew(/obj/effect/decal/cleanable/blood/oil, T) + new /obj/effect/decal/cleanable/blood/oil(T) if(prob(25)) // Keep in mind that only "corners" get any sort of web attempt_web(T, cardinal_turfs) @@ -54,7 +55,7 @@ var/global/list/random_junk var/turf/neighbour = get_step(T, dir) if(neighbour && neighbour.density) if(dir == WEST) - PoolOrNew(/obj/effect/decal/cleanable/cobweb, T) + new /obj/effect/decal/cleanable/cobweb(T) if(dir == EAST) - PoolOrNew(/obj/effect/decal/cleanable/cobweb2, T) + new /obj/effect/decal/cleanable/cobweb2(T) return diff --git a/code/game/turfs/turf_flick_animations.dm b/code/game/turfs/turf_flick_animations.dm index 94f5fec4c5..81b248ec0d 100644 --- a/code/game/turfs/turf_flick_animations.dm +++ b/code/game/turfs/turf_flick_animations.dm @@ -5,7 +5,7 @@ location = get_turf(target) if(location && !target) target = location - var/atom/movable/overlay/animation = PoolOrNew(/atom/movable/overlay, location) + var/atom/movable/overlay/animation = new /atom/movable/overlay(location) if(direction) animation.set_dir(direction) animation.icon = a_icon diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index affa55ce10..439e1f1b7f 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -249,7 +249,11 @@ "Anything Legal Considered", "New Toy", "Me, I'm Always Counting", - "Just Five More Minutes" + "Just Five More Minutes", + "Are You Feeling It", + "Great White Snark", + "No Shirt No Shoes", + "Callsign" ) diff --git a/code/modules/client/preference_setup/loadout/loadout_general.dm b/code/modules/client/preference_setup/loadout/loadout_general.dm index a97d5776fc..6f3115fd2f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_general.dm +++ b/code/modules/client/preference_setup/loadout/loadout_general.dm @@ -10,6 +10,10 @@ display_name = "dice pack (gaming)" path = /obj/item/weapon/storage/pill_bottle/dice_nerd +/datum/gear/dice/cup + display_name = "dice cup and dice" + path = /obj/item/weapon/storage/dicecup/loaded + /datum/gear/cards display_name = "deck of cards" path = /obj/item/weapon/deck/cards diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index ccc5214b55..881da0b8c8 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -5,6 +5,10 @@ slot = slot_w_uniform sort_category = "Uniforms and Casual Dress" +/datum/gear/uniform/blazerskirt + display_name = "blazer, blue with skirt" + path = /obj/item/clothing/under/blazer/skirt + /datum/gear/uniform/cheongsam display_name = "cheongsam selection" @@ -190,26 +194,50 @@ display_name = "suit, shiny-black" path = /obj/item/clothing/under/lawyer/black +/datum/gear/uniform/suit/shinyblackskirt + display_name = "suit, shiny-black skirt" + path = /obj/item/clothing/under/lawyer/black/skirt + /datum/gear/uniform/suit/blue display_name = "suit, blue" path = /obj/item/clothing/under/lawyer/blue +/datum/gear/uniform/suit/blueskirt + display_name = "suit, blue skirt" + path = /obj/item/clothing/under/lawyer/blue/skirt + /datum/gear/uniform/suit/burgundy display_name = "suit, burgundy" path = /obj/item/clothing/under/suit_jacket/burgundy +/datum/gear/uniform/suit/burgundyskirt + display_name = "suit, burgundy skirt" + path = /obj/item/clothing/under/suit_jacket/burgundy/skirt + /datum/gear/uniform/suit/checkered display_name = "suit, checkered" path = /obj/item/clothing/under/suit_jacket/checkered +/datum/gear/uniform/suit/checkeredskirt + display_name = "suit, checkered skirt" + path = /obj/item/clothing/under/suit_jacket/checkered/skirt + /datum/gear/uniform/suit/charcoal display_name = "suit, charcoal" path = /obj/item/clothing/under/suit_jacket/charcoal +/datum/gear/uniform/suit/charcoalskirt + display_name = "suit, charcoal skirt" + path = /obj/item/clothing/under/suit_jacket/charcoal/skirt + /datum/gear/uniform/suit/exec display_name = "suit, executive" path = /obj/item/clothing/under/suit_jacket/really_black +/datum/gear/uniform/suit/execskirt + display_name = "suit, executive skirt" + path = /obj/item/clothing/under/suit_jacket/really_black/skirt + /datum/gear/uniform/suit/femaleexec display_name = "suit, female-executive" path = /obj/item/clothing/under/suit_jacket/female @@ -218,18 +246,34 @@ display_name = "suit, gentlemen" path = /obj/item/clothing/under/gentlesuit +/datum/gear/uniform/suit/gentleskirt + display_name = "suit, lady" + path = /obj/item/clothing/under/gentlesuit/skirt + /datum/gear/uniform/suit/navy display_name = "suit, navy" path = /obj/item/clothing/under/suit_jacket/navy +/datum/gear/uniform/suit/navyskirt + display_name = "suit, navy skirt" + path = /obj/item/clothing/under/suit_jacket/navy/skirt + /datum/gear/uniform/suit/red display_name = "suit, red" path = /obj/item/clothing/under/suit_jacket/red +/datum/gear/uniform/suit/redskirt + display_name = "suit, red skirt" + path = /obj/item/clothing/under/suit_jacket/red/skirt + /datum/gear/uniform/suit/redlawyer display_name = "suit, lawyer-red" path = /obj/item/clothing/under/lawyer/red +/datum/gear/uniform/suit/redlawyerskirt + display_name = "suit, lawyer-red skirt" + path = /obj/item/clothing/under/lawyer/red/skirt + /datum/gear/uniform/suit/oldman display_name = "suit, old-man" path = /obj/item/clothing/under/lawyer/oldman @@ -238,18 +282,49 @@ display_name = "suit, purple" path = /obj/item/clothing/under/lawyer/purpsuit +/datum/gear/uniform/suit/purpleskirt + display_name = "suit, purple skirt" + path = /obj/item/clothing/under/lawyer/purpsuit/skirt + /datum/gear/uniform/suit/tan display_name = "suit, tan" path = /obj/item/clothing/under/suit_jacket/tan +/datum/gear/uniform/suit/tanskirt + display_name = "suit, tan skirt" + path = /obj/item/clothing/under/suit_jacket/tan/skirt + /datum/gear/uniform/suit/white display_name = "suit, white" path = /obj/item/clothing/under/scratch +/datum/gear/uniform/suit/whiteskirt + display_name = "suit, white skirt" + path = /obj/item/clothing/under/scratch/skirt + /datum/gear/uniform/suit/whiteblue display_name = "suit, white-blue" path = /obj/item/clothing/under/lawyer/bluesuit +/datum/gear/uniform/suit/whiteblueskirt + display_name = "suit, white-blue skirt" + path = /obj/item/clothing/under/lawyer/bluesuit/skirt + +/datum/gear/uniform/suit/detectiveskirt + display_name = "suit, detective skirt (Detective)" + path = /obj/item/clothing/under/det/skirt + allowed_roles = list("Detective") + +/datum/gear/uniform/suit/iaskirt + display_name = "suit, Internal Affairs skirt (Internal Affairs)" + path = /obj/item/clothing/under/rank/internalaffairs/skirt + allowed_roles = list("Internal Affairs Agent") + +/datum/gear/uniform/suit/bartenderskirt + display_name = "suit, bartender skirt (Bartender)" + path = /obj/item/clothing/under/rank/bartender/skirt + allowed_roles = list("Bartender") + /datum/gear/uniform/scrubs display_name = "scrubs, black" path = /obj/item/clothing/under/rank/medical/black @@ -271,6 +346,10 @@ display_name = "scrubs, navy blue" path = /obj/item/clothing/under/rank/medical/navyblue +/datum/gear/uniform/oldwoman + display_name = "old woman attire" + path = /obj/item/clothing/under/lawyer/oldwoman + /datum/gear/uniform/sundress display_name = "sundress" path = /obj/item/clothing/under/sundress diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index f891cf552b..9757e28846 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -74,7 +74,7 @@ var/tail_display = "Normal" if(pref.tail_style && (pref.tail_style in tail_styles_list)) - var/datum/sprite_accessory/ears/instance = tail_styles_list[pref.tail_style] + var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] tail_display = instance.name else if(pref.tail_style) tail_display = "REQUIRES UPDATE" @@ -116,7 +116,7 @@ else if(href_list["tail_style"]) // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = list("Normal") + var/list/pretty_tail_styles = list("Normal" = null) for(var/path in tail_styles_list) var/datum/sprite_accessory/tail/instance = tail_styles_list[path] if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed)) @@ -124,13 +124,8 @@ // Present choice to user var/selection = input(user, "Pick tails", "Character Preference") as null|anything in pretty_tail_styles - if(selection && selection != "Normal") - pref.tail_style = pretty_tail_styles[selection] - else - if(pref.tail_style) - return TOPIC_REFRESH_UPDATE_PREVIEW - else - pref.tail_style = null + pref.tail_style = pretty_tail_styles[selection] + return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["tail_color"]) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 9e27f5c73d..4fb748f73a 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -132,7 +132,7 @@ BLIND // can't see anything eye = !eye if(eye) - icon_state = "[icon_state]_r" + icon_state = "[icon_state]_1" else icon_state = initial(icon_state) update_clothing_icon() @@ -395,7 +395,8 @@ BLIND // can't see anything toggleable = 1 action_button_name = "Toggle Goggles" vision_flags = SEE_MOBS - see_invisible = INVISIBILITY_LEVEL_TWO + see_invisible = SEE_INVISIBLE_NOLIGHTING + emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index da4e8c9da5..075411cd29 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -183,7 +183,7 @@ /obj/item/rig_module/self_destruct/New() ..() - src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) + src.smoke = new /datum/effect/effect/system/smoke_spread/bad() src.smoke.attach(src) /obj/item/rig_module/self_destruct/Destroy() diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm index 49ee283ec1..509b58e546 100644 --- a/code/modules/clothing/suits/armor_vr.dm +++ b/code/modules/clothing/suits/armor_vr.dm @@ -33,6 +33,7 @@ H << "You need to have a wolf-taur half to wear this." return 0 + /obj/item/clothing/suit/storage/vest/hoscoat armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 4394d66195..cd345fc8aa 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -257,6 +257,14 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER +/obj/item/clothing/suit/straight_jacket/attack_hand(mob/living/user as mob) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(src == H.wear_suit) + to_chat(H, "You need help taking this off!") + return + ..() + /obj/item/clothing/suit/ianshirt name = "worn shirt" desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in." diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index a68605ff91..5d734c9d95 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -107,7 +107,7 @@ if(!H.holstered) var/obj/item/W = usr.get_active_hand() if(!istype(W, /obj/item)) - usr << "You need your gun equiped to holster it." + usr << "You need your gun equipped to holster it." return H.holster(W, usr) else diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index a6b5c15ea3..d14cff333b 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -6,6 +6,12 @@ icon_state = "ba_suit" rolled_sleeves = 0 +/obj/item/clothing/under/rank/bartender/skirt + desc = "Short and cute." + name = "bartender's skirt" + icon_state = "ba_suit_skirt" + item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") + /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Colony Director\"." name = "colony director's jumpsuit" @@ -97,6 +103,11 @@ rolled_sleeves = 0 starting_accessories = list(/obj/item/clothing/accessory/black) +/obj/item/clothing/under/rank/internalaffairs/skirt + desc = "The plain, professional attire of an Internal Affairs Agent. The top button is sewn shut." + name = "Internal Affairs skirt" + icon_state = "internalaffairs_skirt" + /obj/item/clothing/under/rank/janitor desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" @@ -112,6 +123,11 @@ name = "black Lawyer suit" icon_state = "lawyer_black" +/obj/item/clothing/under/lawyer/black/skirt + name = "black Lawyer skirt" + icon_state = "lawyer_black_skirt" + item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") + /obj/item/clothing/under/lawyer/female name = "black Lawyer suit" icon_state = "black_suit_fem" @@ -121,28 +137,52 @@ name = "red Lawyer suit" icon_state = "lawyer_red" +/obj/item/clothing/under/lawyer/red/skirt + name = "red Lawyer skirt" + icon_state = "lawyer_red_skirt" + item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red") + /obj/item/clothing/under/lawyer/blue name = "blue Lawyer suit" icon_state = "lawyer_blue" +/obj/item/clothing/under/lawyer/blue/skirt + name = "blue Lawyer skirt" + icon_state = "lawyer_blue_skirt" + item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") + /obj/item/clothing/under/lawyer/bluesuit - name = "Blue Suit" + name = "blue suit" desc = "A classy suit." icon_state = "bluesuit" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") starting_accessories = list(/obj/item/clothing/accessory/red) +/obj/item/clothing/under/lawyer/bluesuit/skirt + name = "blue skirt suit" + icon_state = "bluesuit_skirt" + /obj/item/clothing/under/lawyer/purpsuit - name = "Purple Suit" + name = "purple Suit" icon_state = "lawyer_purp" item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") +/obj/item/clothing/under/lawyer/purpsuit/skirt + name = "purple skirt suit" + icon_state = "lawyer_purp_skirt" + /obj/item/clothing/under/lawyer/oldman name = "Old Man's Suit" desc = "A classic suit for the older gentleman with built in back support." icon_state = "oldman" item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny") +/obj/item/clothing/under/lawyer/oldwoman + name = "Old Woman's Attire" + desc = "A typical outfit for the older woman, a lovely cardigan and comfortable skirt." + icon_state = "oldwoman" + item_state_slots = list(slot_r_hand_str = "johnny", slot_l_hand_str = "johnny") + /obj/item/clothing/under/librarian name = "sensible suit" desc = "It's very... sensible." diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index c745e7e9b4..02dde0f815 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -113,6 +113,12 @@ desc = "A serious-looking tan dress shirt paired with freshly-pressed black slacks, complete with a red striped tie and waistcoat." starting_accessories = list(/obj/item/clothing/accessory/red_long, /obj/item/clothing/accessory/wcoat) +/obj/item/clothing/under/det/skirt + name = "detective's skirt" + icon_state = "detective_skirt" + desc = "A serious-looking white blouse paired with a formal black pencil skirt." + item_state_slots = list(slot_r_hand_str = "sl_suit", slot_l_hand_str = "sl_suit") + /* * Head of Security */ diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index cd7c47fb3d..f58d601d8a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -21,6 +21,11 @@ desc = "A white suit, suitable for an excellent host" icon_state = "scratch" +/obj/item/clothing/under/scratch/skirt + name = "white skirt suit" + icon_state = "scratch_skirt" + item_state_slots = list(slot_r_hand_str = "scratch", slot_l_hand_str = "scratch") + /obj/item/clothing/under/sl_suit desc = "It's a very amish looking suit." name = "amish suit" @@ -98,6 +103,11 @@ rolled_sleeves = 0 starting_accessories = list(/obj/item/clothing/accessory/darkgreen) +/obj/item/clothing/under/gov/skirt + name = "Green formal skirt uniform" + desc = "A neat proper uniform of someone on offical business. The top button is sewn shut." + icon_state = "greensuit_skirt" + /obj/item/clothing/under/space name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." @@ -147,24 +157,37 @@ /obj/item/clothing/under/gentlesuit name = "gentlemans suit" - desc = "A silk black shirt with a white tie and a matching gray vest and slacks. Feels proper." + desc = "A silk black shirt with matching gray slacks. Feels proper." icon_state = "gentlesuit" item_state_slots = list(slot_r_hand_str = "grey", slot_l_hand_str = "grey") rolled_sleeves = 0 starting_accessories = list(/obj/item/clothing/accessory/white, /obj/item/clothing/accessory/wcoat/gentleman) +/obj/item/clothing/under/gentlesuit/skirt + name = "lady's suit" + desc = "A silk black blouse with a matching gray skirt. Feels proper." + icon_state = "gentlesuit_skirt" + /obj/item/clothing/under/gimmick/rank/captain/suit name = "colony director's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom") +/obj/item/clothing/under/gimmick/rank/captain/suit/skirt + name = "colony director's skirt suit" + icon_state = "green_suit_skirt" + /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit name = "head of personnel's suit" desc = "A teal suit and yellow necktie. An authoritative yet tacky ensemble." icon_state = "teal_suit" item_state_slots = list(slot_r_hand_str = "green", slot_l_hand_str = "green") +/obj/item/clothing/under/gimmick/rank/head_of_personnel/suit/skirt + name = "head of personnel's skirt suit" + icon_state = "teal_suit_skirt" + /obj/item/clothing/under/suit_jacket name = "black suit" desc = "A black suit and red tie. Very formal." @@ -177,6 +200,11 @@ icon_state = "really_black_suit" item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") +/obj/item/clothing/under/suit_jacket/really_black/skirt + name = "executive skirt suit" + desc = "A formal black suit and red necktie, intended for the station's finest." + icon_state = "really_black_suit_skirt" + /obj/item/clothing/under/suit_jacket/female name = "executive suit" desc = "A formal trouser suit for women, intended for the station's finest." @@ -196,6 +224,11 @@ icon_state = "red_suit" item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red") +/obj/item/clothing/under/suit_jacket/red/skirt + name = "red skirt suit" + desc = "A red suit and blue necktie. Somewhat formal." + icon_state = "red_suit_skirt" + /obj/item/clothing/under/schoolgirl name = "schoolgirl uniform" desc = "It's just like one of my Japanese animes!" @@ -421,6 +454,10 @@ item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") starting_accessories = list(/obj/item/clothing/accessory/navy, /obj/item/clothing/accessory/charcoal_jacket) +/obj/item/clothing/under/suit_jacket/charcoal/skirt + name = "charcoal skirt" + icon_state = "charcoal_suit_skirt" + /obj/item/clothing/under/suit_jacket/navy name = "navy suit" desc = "A navy suit and red tie, intended for the station's finest." @@ -428,6 +465,10 @@ item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") starting_accessories = list(/obj/item/clothing/accessory/red, /obj/item/clothing/accessory/navy_jacket) +/obj/item/clothing/under/suit_jacket/navy/skirt + name = "navy skirt" + icon_state = "navy_suit_skirt" + /obj/item/clothing/under/suit_jacket/burgundy name = "burgundy suit" desc = "A burgundy suit and black tie. Somewhat formal." @@ -435,6 +476,10 @@ item_state_slots = list(slot_r_hand_str = "lawyer_red", slot_l_hand_str = "lawyer_red") starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/burgundy_jacket) +/obj/item/clothing/under/suit_jacket/burgundy/skirt + name = "burgundy skirt" + icon_state = "burgundy_suit_skirt" + /obj/item/clothing/under/suit_jacket/checkered name = "checkered suit" desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?" @@ -442,6 +487,10 @@ item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") starting_accessories = list(/obj/item/clothing/accessory/black, /obj/item/clothing/accessory/checkered_jacket) +/obj/item/clothing/under/suit_jacket/checkered/skirt + name = "checkered skirt" + icon_state = "checkered_suit_skirt" + /obj/item/clothing/under/suit_jacket/tan name = "tan suit" desc = "A tan suit. Smart, but casual." @@ -449,6 +498,10 @@ item_state_slots = list(slot_r_hand_str = "tan_suit", slot_l_hand_str = "tan_suit") starting_accessories = list(/obj/item/clothing/accessory/yellow, /obj/item/clothing/accessory/tan_jacket) +/obj/item/clothing/under/suit_jacket/tan/skirt + name = "tan skirt" + icon_state = "tan_suit_skirt" + /obj/item/clothing/under/serviceoveralls name = "workman outfit" desc = "The very image of a working man. Not that you're probably doing work." @@ -483,6 +536,11 @@ icon_state = "blue_blazer" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") +/obj/item/clothing/under/blazer/skirt + name = "ladies blue blazer" + desc = "A bold but yet conservative outfit, a red pencil skirt and a navy blazer." + icon_state = "blue_blazer_skirt" + /obj/item/clothing/under/croptop name = "crop top" desc = "A shirt that has had the top cropped. This one is NT sponsored." diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm new file mode 100644 index 0000000000..039631cdb4 --- /dev/null +++ b/code/modules/games/dice.dm @@ -0,0 +1,157 @@ +/obj/item/weapon/dice + name = "d6" + desc = "A dice with six sides." + icon = 'icons/obj/dice.dmi' + icon_state = "d66" + w_class = ITEMSIZE_TINY + var/sides = 6 + var/result = 6 + attack_verb = list("diced") + +/obj/item/weapon/dice/New() + icon_state = "[name][rand(1,sides)]" + +/obj/item/weapon/dice/d4 + name = "d4" + desc = "A dice with four sides." + icon_state = "d44" + sides = 4 + result = 4 + +/obj/item/weapon/dice/d8 + name = "d8" + desc = "A dice with eight sides." + icon_state = "d88" + sides = 8 + result = 8 + +/obj/item/weapon/dice/d10 + name = "d10" + desc = "A dice with ten sides." + icon_state = "d1010" + sides = 10 + result = 10 + +/obj/item/weapon/dice/d12 + name = "d12" + desc = "A dice with twelve sides." + icon_state = "d1212" + sides = 12 + result = 12 + +/obj/item/weapon/dice/d20 + name = "d20" + desc = "A dice with twenty sides." + icon_state = "d2020" + sides = 20 + result = 20 + +/obj/item/weapon/dice/d100 + name = "d100" + desc = "A dice with ten sides. This one is for the tens digit." + icon_state = "d10010" + sides = 10 + result = 10 + +/obj/item/weapon/dice/attack_self(mob/user as mob) + rollDice(user, 0) + +/obj/item/weapon/dice/proc/rollDice(mob/user as mob, var/silent = 0) + result = rand(1, sides) + icon_state = "[name][result]" + + if(!silent) + var/comment = "" + if(sides == 20 && result == 20) + comment = "Nat 20!" + else if(sides == 20 && result == 1) + comment = "Ouch, bad luck." + + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + "You throw [src]. It lands on a [result]. [comment]", \ + "You hear [src] landing on a [result]. [comment]") + +/* + * Dice packs + */ + +/obj/item/weapon/storage/pill_bottle/dice //7d6 + name = "bag of dice" + desc = "It's a small bag with dice inside." + icon = 'icons/obj/dice.dmi' + icon_state = "dicebag" + +/obj/item/weapon/storage/pill_bottle/dice/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/dice( src ) + +/obj/item/weapon/storage/pill_bottle/dice_nerd //DnD dice + name = "bag of gaming dice" + desc = "It's a small bag with gaming dice inside." + icon = 'icons/obj/dice.dmi' + icon_state = "magicdicebag" + +/obj/item/weapon/storage/pill_bottle/dice_nerd/New() + ..() + new /obj/item/weapon/dice/d4( src ) + new /obj/item/weapon/dice( src ) + new /obj/item/weapon/dice/d8( src ) + new /obj/item/weapon/dice/d10( src ) + new /obj/item/weapon/dice/d12( src ) + new /obj/item/weapon/dice/d20( src ) + new /obj/item/weapon/dice/d100( src ) + +/* + *Liar's Dice cup + */ + +/obj/item/weapon/storage/dicecup + name = "dice cup" + desc = "A cup used to conceal and hold dice." + icon = 'icons/obj/dice.dmi' + icon_state = "dicecup" + w_class = ITEMSIZE_SMALL + storage_slots = 5 + can_hold = list( + /obj/item/weapon/dice, + ) + +/obj/item/weapon/storage/dicecup/attack_self(mob/user as mob) + user.visible_message("[user] shakes [src].", \ + "You shake [src].", \ + "You hear dice rolling.") + rollCup(user) + +/obj/item/weapon/storage/dicecup/proc/rollCup(mob/user as mob) + for(var/obj/item/weapon/dice/I in src.contents) + var/obj/item/weapon/dice/D = I + D.rollDice(user, 1) + +/obj/item/weapon/storage/dicecup/proc/revealDice(var/mob/viewer) + for(var/obj/item/weapon/dice/I in src.contents) + var/obj/item/weapon/dice/D = I + to_chat(viewer, "The [D.name] shows a [D.result].") + +/obj/item/weapon/storage/dicecup/verb/peekAtDice() + set category = "Object" + set name = "Peek at Dice" + set desc = "Peek at the dice under your cup." + + revealDice(usr) + +/obj/item/weapon/storage/dicecup/verb/revealDiceHand() + + set category = "Object" + set name = "Reveal Dice" + set desc = "Reveal the dice hidden under your cup." + + for(var/mob/living/player in viewers(3)) + to_chat(player, "[usr] reveals their dice.") + revealDice(player) + + +/obj/item/weapon/storage/dicecup/loaded/New() + ..() + for(var/i = 1 to 5) + new /obj/item/weapon/dice( src ) \ No newline at end of file diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index 89cb299f5f..82b2f62abd 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -13,11 +13,11 @@ if(!holder) return if(!plant_controller || !plant_controller.gene_tag_masks) - usr << "Gene masks not set." + to_chat(usr, "Gene masks not set.") return for(var/mask in plant_controller.gene_tag_masks) - usr << "[mask]: [plant_controller.gene_tag_masks[mask]]" + to_chat(usr, "[mask]: [plant_controller.gene_tag_masks[mask]]") var/global/datum/controller/plants/plant_controller // Set in New(). @@ -33,6 +33,8 @@ var/global/datum/controller/plants/plant_controller // Set in New(). var/list/plant_sprites = list() // List of all harvested product sprites. var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages. var/processing = 0 // Off/on. + var/list/gene_masked_list = list() // Stored gene masked list, rather than recreating it when needed. + var/list/plant_gene_datums = list() // Stored datum versions of the gene masked list. /datum/controller/plants/New() if(plant_controller && plant_controller != src) @@ -83,6 +85,7 @@ var/global/datum/controller/plants/plant_controller // Set in New(). S.update_seed() //Might as well mask the gene types while we're at it. + var/list/gene_datums = decls_repository.decls_of_subtype(/decl/plantgene) var/list/used_masks = list() var/list/plant_traits = ALL_GENES while(plant_traits && plant_traits.len) @@ -92,9 +95,18 @@ var/global/datum/controller/plants/plant_controller // Set in New(). while(gene_mask in used_masks) gene_mask = "[uppertext(num2hex(rand(0,255)))]" + var/decl/plantgene/G + + for(var/D in gene_datums) + var/decl/plantgene/P = gene_datums[D] + if(gene_tag == P.gene_tag) + G = P + gene_datums -= D used_masks += gene_mask plant_traits -= gene_tag gene_tag_masks[gene_tag] = gene_mask + plant_gene_datums[gene_mask] = G + gene_masked_list.Add(list(list("tag" = gene_tag, "mask" = gene_mask))) // Proc for creating a random seed type. /datum/controller/plants/proc/create_random_seed(var/survive_on_station) @@ -147,4 +159,4 @@ var/global/datum/controller/plants/plant_controller // Set in New(). plant_queue |= plant /datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant) - plant_queue -= plant + plant_queue -= plant \ No newline at end of file diff --git a/code/modules/hydroponics/seed_gene_mut.dm b/code/modules/hydroponics/seed_gene_mut.dm new file mode 100644 index 0000000000..cdb7048957 --- /dev/null +++ b/code/modules/hydroponics/seed_gene_mut.dm @@ -0,0 +1,135 @@ +/datum/seed/proc/diverge_mutate_gene(var/decl/plantgene/G, var/turf/T) + if(!istype(G)) + log_debug("Attempted to mutate [src] with a non-plantgene var.") + return src + + var/datum/seed/S = diverge() //Let's not modify all of the seeds. + T.visible_message("\The [S.display_name] quivers!") //Mimicks the normal mutation. + G.mutate(S, T) + + return S + +/decl/plantgene + var/gene_tag + +/decl/plantgene/biochem + gene_tag = GENE_BIOCHEMISTRY + +/decl/plantgene/hardiness + gene_tag = GENE_HARDINESS + +/decl/plantgene/environment + gene_tag = GENE_ENVIRONMENT + +/decl/plantgene/metabolism + gene_tag = GENE_METABOLISM + +/decl/plantgene/structure + gene_tag = GENE_STRUCTURE + +/decl/plantgene/diet + gene_tag = GENE_DIET + +/decl/plantgene/pigment + gene_tag = GENE_PIGMENT + +/decl/plantgene/output + gene_tag = GENE_OUTPUT + +/decl/plantgene/atmosphere + gene_tag = GENE_ATMOSPHERE + +/decl/plantgene/vigour + gene_tag = GENE_VIGOUR + +/decl/plantgene/fruit + gene_tag = GENE_FRUIT + +/decl/plantgene/special + gene_tag = GENE_SPECIAL + +/decl/plantgene/proc/mutate(var/datum/seed/S) + return + +/decl/plantgene/biochem/mutate(var/datum/seed/S) + S.set_trait(TRAIT_POTENCY, S.get_trait(TRAIT_POTENCY)+rand(-20,20),200, 0) + +/decl/plantgene/hardiness/mutate(var/datum/seed/S) + if(prob(60)) + S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0) + +/decl/plantgene/environment/mutate(var/datum/seed/S) + if(prob(60)) + S.set_trait(TRAIT_IDEAL_HEAT, S.get_trait(TRAIT_IDEAL_HEAT)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_IDEAL_LIGHT, S.get_trait(TRAIT_IDEAL_LIGHT)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_LIGHT_TOLERANCE, S.get_trait(TRAIT_LIGHT_TOLERANCE)+rand(-5,5),100,0) + +/decl/plantgene/metabolism/mutate(var/datum/seed/S) + if(prob(65)) + S.set_trait(TRAIT_REQUIRES_NUTRIENTS, S.get_trait(TRAIT_REQUIRES_NUTRIENTS)+rand(-2,2),10,0) + if(prob(65)) + S.set_trait(TRAIT_REQUIRES_WATER, S.get_trait(TRAIT_REQUIRES_WATER)+rand(-2,2),10,0) + if(prob(40)) + S.set_trait(TRAIT_ALTER_TEMP, S.get_trait(TRAIT_ALTER_TEMP)+rand(-5,5),100,0) + +/decl/plantgene/diet/mutate(var/datum/seed/S) + if(prob(60)) + S.set_trait(TRAIT_CARNIVOROUS, S.get_trait(TRAIT_CARNIVOROUS)+rand(-1,1),2,0) + if(prob(60)) + S.set_trait(TRAIT_PARASITE, !S.get_trait(TRAIT_PARASITE)) + if(prob(65)) + S.set_trait(TRAIT_NUTRIENT_CONSUMPTION, S.get_trait(TRAIT_NUTRIENT_CONSUMPTION)+rand(-0.1,0.1),5,0) + if(prob(65)) + S.set_trait(TRAIT_WATER_CONSUMPTION, S.get_trait(TRAIT_WATER_CONSUMPTION)+rand(-1,1),50,0) + +/decl/plantgene/output/mutate(var/datum/seed/S, var/turf/T) + if(prob(50)) + S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM)) + if(S.get_trait(TRAIT_BIOLUM)) + T.visible_message("\The [S.display_name] begins to glow!") + if(prob(50)) + S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) + T.visible_message("\The [S.display_name]'s glow changes colour!") + else + T.visible_message("\The [S.display_name]'s glow dims...") + if(prob(60)) + S.set_trait(TRAIT_PRODUCES_POWER, !S.get_trait(TRAIT_PRODUCES_POWER)) + +/decl/plantgene/atmosphere/mutate(var/datum/seed/S) + if(prob(60)) + S.set_trait(TRAIT_TOXINS_TOLERANCE, S.get_trait(TRAIT_TOXINS_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_PEST_TOLERANCE, S.get_trait(TRAIT_PEST_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_WEED_TOLERANCE, S.get_trait(TRAIT_WEED_TOLERANCE)+rand(-2,2),10,0) + if(prob(60)) + S.set_trait(TRAIT_ENDURANCE, S.get_trait(TRAIT_ENDURANCE)+rand(-5,5),100,0) + +/decl/plantgene/vigour/mutate(var/datum/seed/S, var/turf/T) + if(prob(65)) + S.set_trait(TRAIT_PRODUCTION, S.get_trait(TRAIT_PRODUCTION)+rand(-1,1),10,0) + if(prob(65)) + S.set_trait(TRAIT_MATURATION, S.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0) + if(prob(55)) + S.set_trait(TRAIT_SPREAD, S.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0) + T.visible_message("\The [S.display_name] spasms visibly, shifting in the tray.") + +/decl/plantgene/fruit/mutate(var/datum/seed/S) + if(prob(65)) + S.set_trait(TRAIT_STINGS, !S.get_trait(TRAIT_STINGS)) + if(prob(65)) + S.set_trait(TRAIT_EXPLOSIVE, !S.get_trait(TRAIT_EXPLOSIVE)) + if(prob(65)) + S.set_trait(TRAIT_JUICY, !S.get_trait(TRAIT_JUICY)) + +/decl/plantgene/special/mutate(var/datum/seed/S) + if(prob(65)) + S.set_trait(TRAIT_TELEPORTING, !S.get_trait(TRAIT_TELEPORTING)) diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 1479ffdc5c..bc96f064c9 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -137,9 +137,7 @@ var/list/data = list() - var/list/geneMasks[0] - for(var/gene_tag in plant_controller.gene_tag_masks) - geneMasks.Add(list(list("tag" = gene_tag, "mask" = plant_controller.gene_tag_masks[gene_tag]))) + var/list/geneMasks = plant_controller.gene_masked_list data["geneMasks"] = geneMasks data["activity"] = active diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index efdae46db7..e69c3eec8a 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -181,9 +181,14 @@ return //Override for somatoray projectiles. - if(istype(Proj ,/obj/item/projectile/energy/floramut) && prob(20)) - mutate(1) - return + if(istype(Proj ,/obj/item/projectile/energy/floramut)&& prob(20)) + if(istype(Proj, /obj/item/projectile/energy/floramut/gene)) + var/obj/item/projectile/energy/floramut/gene/G = Proj + if(seed) + seed = seed.diverge_mutate_gene(G.gene, get_turf(loc)) //get_turf just in case it's not in a turf. + else + mutate(1) + return else if(istype(Proj ,/obj/item/projectile/energy/florayield) && prob(20)) yield_mod = min(10,yield_mod+rand(1,2)) return diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm index 759b1586eb..ee5a36785b 100644 --- a/code/modules/integrated_electronics/subtypes/logic.dm +++ b/code/modules/integrated_electronics/subtypes/logic.dm @@ -4,7 +4,7 @@ extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." complexity = 3 outputs = list("result") - activators = list("\ compare", "\ on true result", "\ on false result") + activators = list("\ compare") category_text = "Logic" autopulse = 1 power_draw_per_use = 1 @@ -15,13 +15,10 @@ /obj/item/integrated_circuit/logic/do_work() push_data() - if(get_pin_data(IC_INPUT, 1)) - activate_pin(1) - else - activate_pin(2) /obj/item/integrated_circuit/logic/binary inputs = list("\ A","\ B") + activators = list("\ compare", "\ on true result", "\ on false result") /obj/item/integrated_circuit/logic/binary/do_work() pull_data() @@ -29,6 +26,11 @@ var/datum/integrated_io/B = inputs[2] var/datum/integrated_io/O = outputs[1] O.data = do_compare(A, B) ? TRUE : FALSE + + if(get_pin_data(IC_OUTPUT, 1)) + activate_pin(2) + else + activate_pin(3) ..() /obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) @@ -36,6 +38,7 @@ /obj/item/integrated_circuit/logic/unary inputs = list("\ A") + activators = list("\ compare", "\ on compare") /obj/item/integrated_circuit/logic/unary/do_work() pull_data() @@ -43,6 +46,7 @@ var/datum/integrated_io/O = outputs[1] O.data = do_check(A) ? TRUE : FALSE ..() + activate_pin(2) /obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A) return FALSE @@ -124,6 +128,7 @@ desc = "This gate inverts what's fed into it." icon_state = "not" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + activators = list("\ invert", "\ on inverted") /obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) return !A.data diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 013dc6ebad..e19a308c47 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -212,7 +212,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." - if(stat == DEAD) + if(stat == DEAD && !forbid_seeing_deadchat) announce_ghost_joinleave(ghostize(1)) else var/response @@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return src.client.admin_ghost() else - response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes. + response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") // VOREStation edit because we don't make players stay dead for 30 minutes. if(response != "Ghost") return resting = 1 diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 7b0cbde24e..62f0d93152 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -43,7 +43,7 @@ /mob/living/silicon/ai/proc/create_eyeobj(var/newloc) if(eyeobj) destroy_eyeobj() if(!newloc) newloc = src.loc - eyeobj = PoolOrNew(/mob/observer/eye/aiEye, newloc) + eyeobj = new /mob/observer/eye/aiEye(newloc) eyeobj.owner = src eyeobj.name = "[src.name] (AI Eye)" // Give it a name if(client) client.eye = eyeobj diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index fdb0b012ef..3a451bff44 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -101,7 +101,7 @@ /mob/living/silicon/ai/special_mentions() return list("AI") // AI door! -// Converts specific characters, like *, |, and _ to formatted output. +// Converts specific characters, like +, |, and _ to formatted output. /mob/proc/say_emphasis(var/message) message = encode_html_emphasis(message, "|", "i") message = encode_html_emphasis(message, "+", "b") diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index b1411f2fae..44e0d00280 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -60,7 +60,7 @@ flags = WHITELISTED syllables = list("mrr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", "mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", - "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", + "ka","aasi","far","wa","baq","ara","qara","zir","saam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", "hal","ket","jurl","mah","tul","cresh","azu","ragh","mro","mra","mrro","mrra") /datum/language/tajaran/get_random_name(var/gender) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 323d2909fb..a843206e5e 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -221,7 +221,7 @@ if(building == 1) I = new /obj/item/stack/tile/floor(src) else - I = PoolOrNew(/obj/item/stack/rods, src) + I = new /obj/item/stack/rods(src) A.attackby(I, src) target = null busy = 0 diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 2079f77a35..ead145e388 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -268,8 +268,8 @@ var/turf/Tsec = get_turf(src) new /obj/item/device/assembly/prox_sensor(Tsec) - PoolOrNew(/obj/item/stack/rods, Tsec) - PoolOrNew(/obj/item/stack/rods, Tsec) + new /obj/item/stack/rods(Tsec) + new /obj/item/stack/rods(Tsec) new /obj/item/stack/cable_coil/cut(Tsec) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index ee0c867ffb..b4a47d2e47 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -41,6 +41,13 @@ species.handle_death(src) animate_tail_stop() + //Handle snowflake ling stuff. + if(mind && mind.changeling) + // If the ling is capable of revival, don't allow them to see deadchat. + if(mind.changeling.chem_charges >= CHANGELING_STASIS_COST) + if(mind.changeling.max_geneticpoints >= 0) // Absorbed lings don't count, as they can't revive. + forbid_seeing_deadchat = TRUE + //Handle brain slugs. var/obj/item/organ/external/Hd = get_organ(BP_HEAD) var/mob/living/simple_animal/borer/B diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index e193909359..3af1a52bf6 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -220,7 +220,7 @@ miss_type = 1 if(prob(80)) - hit_zone = ran_zone(hit_zone) + hit_zone = ran_zone(hit_zone, 70) //70% chance to hit what you're aiming at seems fair? if(prob(15) && hit_zone != BP_TORSO) // Missed! if(!src.lying) attack_message = "[H] attempted to strike [src], but missed!" @@ -261,13 +261,13 @@ rand_damage *= 2 real_damage = max(1, real_damage) - var/armour = run_armor_check(affecting, "melee") - var/soaked = get_armor_soak(affecting, "melee") + var/armour = run_armor_check(hit_zone, "melee") + var/soaked = get_armor_soak(hit_zone, "melee") // Apply additional unarmed effects. attack.apply_effects(H, src, armour, rand_damage, hit_zone) // Finally, apply damage to target - apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), affecting, armour, soaked, sharp=attack.sharp, edge=attack.edge) + apply_damage(real_damage, (attack.deal_halloss ? HALLOSS : BRUTE), hit_zone, armour, soaked, sharp=attack.sharp, edge=attack.edge) if(I_DISARM) M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])") diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 02d85bbcfa..30ee7c64d6 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -185,6 +185,26 @@ wearing_rig.notify_ai("Warning: user consciousness failure. Mobility control passed to integrated intelligence system.") ..() +/mob/living/carbon/human/proc/Stasis(amount) + if((species.flags & NO_SCAN) || isSynthetic()) + in_stasis = 0 + else + in_stasis = amount + +/mob/living/carbon/human/proc/getStasis() + if((species.flags & NO_SCAN) || isSynthetic()) + return 0 + + return in_stasis + +//This determines if, RIGHT NOW, the life() tick is being skipped due to stasis +/mob/living/carbon/human/proc/inStasisNow() + var/stasisValue = getStasis() + if(stasisValue && (life_tick % stasisValue)) + return 1 + + return 0 + /mob/living/carbon/human/getCloneLoss() if((species.flags & NO_SCAN) || isSynthetic()) cloneloss = 0 diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 29289d34b6..4cbb691239 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -13,9 +13,11 @@ handle_embedded_objects() //Moving with objects stuck in you can cause bad times. if(force_max_speed) - return -3 // Returning -1 will actually result in a slowdown for Teshari. + return -3 for(var/datum/modifier/M in modifiers) + if(!isnull(M.haste) && M.haste == TRUE) + return -3 // Returning -1 will actually result in a slowdown for Teshari. if(!isnull(M.slowdown)) tally += M.slowdown @@ -90,9 +92,7 @@ if(T && T.movement_cost) tally += T.movement_cost - if(species.item_slowdown_halved) - if(item_tally > 0) - item_tally *= 0.5 + item_tally *= species.item_slowdown_mod tally += item_tally diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 3ae084dc4f..a0cfc6f0a8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -62,8 +62,12 @@ voice = GetVoice() + var/stasis = inStasisNow() + if(getStasis() > 2) + Sleeping(20) + //No need to update all of these procs if the guy is dead. - if(stat != DEAD && !in_stasis) + if(stat != DEAD && !stasis) //Updates the number of stored chemicals for powers handle_changeling() @@ -82,8 +86,6 @@ if(!client) species.handle_npc(src) - else //VOREStation Addition - Stasis bags op pls nerf - if(in_stasis) Sleeping(5) if(!handle_some_updates()) return //We go ahead and process them 5 times for HUD images and other stuff though. @@ -98,7 +100,7 @@ return 1 /mob/living/carbon/human/breathe() - if(!in_stasis) + if(!inStasisNow()) ..() // Calculate how vulnerable the human is to under- and overpressure. @@ -208,7 +210,7 @@ /mob/living/carbon/human/handle_mutations_and_radiation() - if(in_stasis) + if(inStasisNow()) return if(getFireLoss()) @@ -789,7 +791,7 @@ /mob/living/carbon/human/handle_chemicals_in_body() - if(in_stasis) + if(inStasisNow()) return if(reagents) @@ -1345,7 +1347,7 @@ if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING /mob/living/carbon/human/handle_random_events() - if(in_stasis) + if(inStasisNow()) return // Puke if toxloss is too high diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8a8650aa9b..f547cba9fc 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -133,7 +133,7 @@ var/appearance_flags = 0 // Appearance/display related features. var/spawn_flags = 0 // Flags that specify who can spawn as this species var/slowdown = 0 // Passive movement speed malus (or boost, if negative) - var/item_slowdown_halved = 0 // If this is on, they're not as affected by item weights for slowdown + var/item_slowdown_mod = 1 // How affected by item slowdown the species is. var/primitive_form // Lesser form, if any (ie. monkey for humans) var/greater_form // Greater form, if any, ie. human for monkeys. var/holder_type diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 07876d1985..07c5cefb86 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -32,23 +32,23 @@ primitive_form = "Stok" darksight = 3 ambiguous_genders = TRUE - //gluttonous = 1 //VOREStation Edit - Redundant + //gluttonous = 1 //VOREStation Edit - Redundant slowdown = 0.5 - brute_mod = 0.9 - burn_mod = 0.9 + brute_mod = 0.85 + burn_mod = 0.85 metabolic_rate = 0.85 - item_slowdown_halved = 1 + item_slowdown_mod = 0.5 num_alternate_languages = 3 secondary_langs = list(LANGUAGE_UNATHI) name_language = LANGUAGE_UNATHI health_hud_intensity = 2.5 - min_age = 18 - max_age = 60 + min_age = 32 + max_age = 260 blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \ - Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, radioactive \ - desert planet, they mostly hold ideals of honesty, virtue, martial combat and bravery above all \ + Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, inhospitable \ + planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \ else, frequently even their own lives. They prefer warmer temperatures than most species and \ their native tongue is a heavy hissing laungage called Sinta'Unathi." /* VOREStation Removal @@ -256,6 +256,7 @@ secondary_langs = list(LANGUAGE_ROOTGLOBAL) name_language = LANGUAGE_ROOTLOCAL health_hud_intensity = 2.5 + item_slowdown_mod = 0.25 min_age = 1 max_age = 300 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 57daff2b76..25062513bb 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -131,10 +131,11 @@ Please contact me on #coderbus IRC. ~Carn x #define LEGCUFF_LAYER 23 #define L_HAND_LAYER 24 #define R_HAND_LAYER 25 -#define FIRE_LAYER 26 //If you're on fire -#define WATER_LAYER 27 //If you're submerged in water. -#define TARGETED_LAYER 28 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 29 +#define MODIFIER_EFFECTS_LAYER 26 +#define FIRE_LAYER 27 //If you're on fire +#define WATER_LAYER 28 //If you're submerged in water. +#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system +#define TOTAL_LAYERS 30 ////////////////////////////////// /mob/living/carbon/human @@ -1146,6 +1147,18 @@ var/global/list/damage_icon_parts = list() if(update_icons) update_icons() +/mob/living/carbon/human/update_modifier_visuals(var/update_icons=1) + overlays_standing[MODIFIER_EFFECTS_LAYER] = null + var/image/effects = new() + for(var/datum/modifier/M in modifiers) + if(M.mob_overlay_state) + var/image/I = image("icon" = 'icons/mob/modifier_effects.dmi', "icon_state" = M.mob_overlay_state) + effects.overlays += I + + overlays_standing[MODIFIER_EFFECTS_LAYER] = effects + + if(update_icons) + update_icons() /mob/living/carbon/human/update_fire(var/update_icons=1) overlays_standing[FIRE_LAYER] = null diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index dafeb2d37d..459195f092 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -975,6 +975,11 @@ default behaviour is: update_icons() return canmove +// Adds overlays for specific modifiers. +// You'll have to add your own implementation for non-humans currently, just override this proc. +/mob/living/proc/update_modifier_visuals() + return + /mob/living/proc/update_water() // Involves overlays for humans. Maybe we'll get submerged sprites for borgs in the future? return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index b60ff078a3..66e1278e22 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -439,3 +439,11 @@ hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) client.screen += hud_used.hide_actions_toggle + +// Returns a number to determine if something is harder or easier to hit than normal. +/mob/living/proc/get_evasion() + var/result = evasion // First we get the 'base' evasion. Generally this is zero. + for(var/datum/modifier/M in modifiers) + if(!isnull(M.evasion)) + result += M.evasion + return result diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 0b1eb0ccda..4046c55612 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -141,7 +141,7 @@ proc/get_radio_key_from_channel(var/channel) //Redirect to say_dead if talker is dead if(stat) - if(stat == DEAD) + if(stat == DEAD && !forbid_seeing_deadchat) return say_dead(message) return @@ -324,7 +324,7 @@ proc/get_radio_key_from_channel(var/channel) if(M && src) //If we still exist, when the spawn processes var/dst = get_dist(get_turf(M),get_turf(src)) - if(dst <= message_range || M.stat == DEAD) //Inside normal message range, or dead with ears (handled in the view proc) + if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc) M << (listening[M] || speech_bubble) // VOREStation Edit - Send the image attached to shadow mob if available M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 26e1b264fd..9a5bd4e574 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -80,7 +80,7 @@ time_last_drone = world.time if(player.mob && player.mob.mind) player.mob.mind.reset() - var/mob/living/silicon/robot/drone/new_drone = PoolOrNew(drone_type, get_turf(src)) + var/mob/living/silicon/robot/drone/new_drone = new drone_type(get_turf(src)) new_drone.transfer_personality(player) new_drone.master_fabricator = src diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm index 06de6b4d14..186afd6ed3 100644 --- a/code/modules/mob/living/simple_animal/aliens/drone.dm +++ b/code/modules/mob/living/simple_animal/aliens/drone.dm @@ -176,16 +176,16 @@ step_to(O, get_turf(pick(view(7, src)))) //rods - O = PoolOrNew(/obj/item/stack/rods, src.loc) + O = new /obj/item/stack/rods(src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(75)) - O = PoolOrNew(/obj/item/stack/rods, src.loc) + O = new /obj/item/stack/rods(src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(50)) - O = PoolOrNew(/obj/item/stack/rods, src.loc) + O = new /obj/item/stack/rods(src.loc) step_to(O, get_turf(pick(view(7, src)))) if(prob(25)) - O = PoolOrNew(/obj/item/stack/rods, src.loc) + O = new /obj/item/stack/rods(src.loc) step_to(O, get_turf(pick(view(7, src)))) //plasteel diff --git a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm b/code/modules/mob/living/simple_animal/animals/corgi_vr.dm index cff3227439..1cf3930452 100644 --- a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/corgi_vr.dm @@ -55,7 +55,7 @@ inventory_head = null regenerate_icons() else - usr << "\red There is nothing to remove from its [remove_from]." + to_chat(usr, "There is nothing to remove from its [remove_from].") return if("back") if(inventory_back) @@ -63,7 +63,7 @@ inventory_back = null regenerate_icons() else - usr << "\red There is nothing to remove from its [remove_from]." + to_chat(usr, "There is nothing to remove from its [remove_from].") return //Adding things to inventory diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm index acb1d7a1b7..e2c833000e 100644 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm @@ -103,7 +103,7 @@ if(istype(I, /obj/effect/spider/eggcluster)) eggcount ++ if(!eggcount) - var/eggs = PoolOrNew(/obj/effect/spider/eggcluster/small, list(O, src)) + var/eggs = new /obj/effect/spider/eggcluster/small(O, src) O.implants += eggs H << "The [src] injects something into your [O.name]!" @@ -172,7 +172,7 @@ if(busy == LAYING_EGGS) E = locate() in get_turf(src) if(!E) - PoolOrNew(/obj/effect/spider/eggcluster, list(loc, src)) + new /obj/effect/spider/eggcluster(loc, src) fed-- busy = 0 stop_automated_movement = 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 51a250046c..d8d4d45c12 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -208,3 +208,4 @@ var/list/active_genes=list() var/mob_size = MOB_MEDIUM var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping + var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4327840a47..ba5b24dbe7 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -390,10 +390,16 @@ proc/is_blind(A) else name = realname + if(subject && subject.forbid_seeing_deadchat && !subject.client.holder) + return // Can't talk in deadchat if you can't see it. + for(var/mob/M in player_list) if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay)) var/follow var/lname + if(M.forbid_seeing_deadchat && !M.client.holder) + continue + if(subject) if(M.is_key_ignored(subject.client.key)) // If we're ignored, do nothing. continue diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 476a8b6810..a553d4309c 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -199,7 +199,7 @@ if(S.victim == mob) return - if(mob.stat==DEAD && isliving(mob)) + if(mob.stat==DEAD && isliving(mob) && !mob.forbid_seeing_deadchat) mob.ghostize() return diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/modifiers.dm index 6ba148916e..8e1f9e2f6f 100644 --- a/code/modules/mob/modifiers.dm +++ b/code/modules/mob/modifiers.dm @@ -14,6 +14,11 @@ var/stacks = MODIFIER_STACK_FORBID // If true, attempts to add a second instance of this type will refresh expire_at instead. var/flags = 0 // Flags for the modifier, see mobs.dm defines for more details. + var/light_color = null // If set, the mob possessing the modifier will glow in this color. Not implemented yet. + var/light_range = null // How far the light for the above var goes. Not implemented yet. + var/light_intensity = null // Ditto. Not implemented yet. + var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented. + // Now for all the different effects. // Percentage modifiers are expressed as a multipler. (e.g. +25% damage should be written as 1.25) var/max_health_flat // Adjusts max health by a flat (e.g. +20) amount. Note this is added to base health. @@ -29,6 +34,8 @@ var/incoming_healing_percent // Adjusts amount of healing received. var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand. var/slowdown // Negative numbers speed up, positive numbers slow down movement. + var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast. + var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds. /datum/modifier/New(var/new_holder) holder = new_holder @@ -44,12 +51,18 @@ to_chat(holder, on_expired_text) on_expire() holder.modifiers.Remove(src) + if(mob_overlay_state) // We do this after removing ourselves from the list so that the overlay won't remain. + holder.update_modifier_visuals() qdel(src) // Override this for special effects when it gets removed. /datum/modifier/proc/on_expire() return +// Called every Life() tick. Override for special behaviour. +/datum/modifier/proc/tick() + return + /mob/living var/list/modifiers = list() // A list of modifier datums, which can adjust certain mob numbers. @@ -64,13 +77,16 @@ // Get rid of anything we shouldn't have. for(var/datum/modifier/M in modifiers) M.check_if_valid() + // Remaining modifiers will now receive a tick(). This is in a second loop for safety in order to not tick() an expired modifier. + for(var/datum/modifier/M in modifiers) + M.tick() // Call this to add a modifier to a mob. First argument is the modifier type you want, second is how long it should last, in ticks. // The SECONDS/MINUTES macro is very helpful for this. E.g. M.add_modifier(/datum/modifier/example, 5 MINUTES) /mob/living/proc/add_modifier(var/modifier_type, var/expire_at = null) // First, check if the mob already has this modifier. for(var/datum/modifier/M in modifiers) - if(ispath(modifier_type, M.type)) + if(istype(modifier_type, M)) switch(M.stacks) if(MODIFIER_STACK_FORBID) return // Stop here. @@ -89,6 +105,8 @@ if(mod.on_created_text) to_chat(src, mod.on_created_text) modifiers.Add(mod) + if(mod.mob_overlay_state) + update_modifier_visuals() // Removes a specific instance of modifier /mob/living/proc/remove_specific_modifier(var/datum/modifier/M, var/silent = FALSE) @@ -97,10 +115,17 @@ // Removes all modifiers of a type /mob/living/proc/remove_modifiers_of_type(var/modifier_type, var/silent = FALSE) for(var/datum/modifier/M in modifiers) - if(ispath(modifier_type, M.type)) + if(istype(M, modifier_type)) M.expire(silent) // Removes all modifiers, useful if the mob's being deleted /mob/living/proc/remove_all_modifiers(var/silent = FALSE) for(var/datum/modifier/M in modifiers) - M.expire(silent) \ No newline at end of file + M.expire(silent) + +// Checks if the mob has a modifier type. +/mob/living/proc/has_modifier_of_type(var/modifier_type) + for(var/datum/modifier/M in modifiers) + if(istype(M, modifier_type)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index f6679a6dfe..04e45f93d0 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -206,6 +206,10 @@ icon_state = "hair_bobcut" species_allowed = list("Human","Unathi") + bobcutalt + name = "Chin Length Bob" + icon_state = "hair_bobcutalt" + bun name = "Bun" icon_state = "hair_bun" @@ -361,6 +365,14 @@ name = "Hime Cut" icon_state = "hair_himecut" + shorthime + name = "Short Hime Cut" + icon_state = "hair_shorthime" + + grandebraid + name = "Grande Braid" + icon_state = "hair_grande" + mbraid name = "Medium Braid" icon_state = "hair_shortbraid" @@ -369,6 +381,10 @@ name = "Long Braid" icon_state = "hair_hbraid" + braid + name = "Floorlength Braid" + icon_state = "hair_braid" + odango name = "Odango" icon_state = "hair_odango" @@ -398,6 +414,10 @@ name = "Drillruru" icon_state = "hair_drillruru" + fringetail + name = "Fringetail" + icon_state = "hair_fringetail" + dandypomp name = "Dandy Pompadour" icon_state = "hair_dandypompadour" @@ -549,7 +569,53 @@ icon_state = "hair_shavedpart" gender = MALE + hightight + name = "High and Tight" + icon_state = "hair_hightight" + rowbun + name = "Row Bun" + icon_state = "hair_rowbun" + + rowdualbraid + name = "Row Dual Braid" + icon_state = "hair_rowdualtail" + + rowbraid + name = "Row Braid" + icon_state = "hair_rowbraid" + + regulationmohawk + name = "Regulation Mohawk" + icon_state = "hair_shavedmohawk" + + topknot + name = "Topknot" + icon_state = "hair_topknot" + + ronin + name = "Ronin" + icon_state = "hair_ronin" + + bowlcut2 + name = "Bowl2" + icon_state = "hair_bowlcut2" + + thinning + name = "Thinning" + icon_state = "hair_thinning" + + thinningfront + name = "Thinning Front" + icon_state = "hair_thinningfront" + + thinningback + name = "Thinning Back" + icon_state = "hair_thinningrear" + + manbun + name = "Manbun" + icon_state = "hair_manbun" /* /////////////////////////////////// / =---------------------------= / @@ -674,6 +740,13 @@ name = "Walrus Moustache" icon_state = "facial_walrus" + croppedbeard + name = "Full Cropped Beard" + icon_state = "facial_croppedfullbeard" + + chinless + name = "Chinless Beard" + icon_state = "facial_chinlessbeard" /* /////////////////////////////////// / =---------------------------= / diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 72a16f2296..a0a6762ac0 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -377,4 +377,9 @@ icon_state = "sergal_full_female" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) species_allowed = list("Sergal") - gender = FEMALE \ No newline at end of file + gender = FEMALE + + monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index b7f61f28fa..f87a2db080 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -37,7 +37,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5 // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() - if(in_stasis) + if(inStasisNow()) return if(!should_have_organ(O_HEART)) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 7a5c42ea41..583b56921d 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -882,7 +882,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(!clean) // Throw limb around. if(src && istype(loc,/turf)) - throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) + throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) dir = 2 if(DROPLIMB_BURN) new /obj/effect/decal/cleanable/ash(get_turf(victim)) @@ -901,19 +901,19 @@ Note that amputating the affected organ does in fact remove the infection from t gore.basecolor = use_blood_colour gore.update_icon() - gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) + gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/obj/item/organ/I in internal_organs) I.removed() if(istype(loc,/turf)) - I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) + I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) for(var/obj/item/I in src) if(I.w_class <= ITEMSIZE_SMALL) qdel(I) continue I.loc = get_turf(src) - I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) + I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5) qdel(src) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 91492d8aab..b1872dd899 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -44,6 +44,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/parts = BP_ALL //Defines what parts said brand can replace on a body. var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. +/datum/robolimb/unbranded_monitor + company = "Unbranded Monitor" + desc = "A generic unbranded interpretation of a popular prosthetic head model. It looks rudimentary and cheaply constructed." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi' + parts = list(BP_HEAD) + monitor_styles = standard_monitor_styles + unavailable_to_build = 1 + /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 3283e67f7d..41f0619187 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -123,7 +123,7 @@ if(!paperamount) return paperamount-- - return PoolOrNew(/obj/item/weapon/shreddedp, get_turf(src)) + return new /obj/item/weapon/shreddedp(get_turf(src)) /obj/machinery/papershredder/power_change() ..() @@ -185,5 +185,5 @@ var/mob/living/M = loc if(istype(M)) M.drop_from_inventory(src) - PoolOrNew(/obj/effect/decal/cleanable/ash,get_turf(src)) + new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f7d963523c..9cb7292baf 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -182,7 +182,11 @@ if (A == user && user.zone_sel.selecting == O_MOUTH && !mouthshoot) handle_suicide(user) else if(user.a_intent == I_HURT) //point blank shooting - Fire(A, user, pointblank=1) + if(user && user.client && user.aiming && user.aiming.active && user.aiming.aiming_at != A && A != user) + PreFire(A,user) //They're using the new gun system, locate what they're aiming at. + return + else + Fire(A, user, pointblank=1) else return ..() //Pistolwhippin' @@ -326,6 +330,8 @@ user.setMoveCooldown(move_delay) next_fire_time = world.time + fire_delay + accuracy = initial(accuracy) //Reset the gun's accuracy + if(muzzle_flash) set_light(0) @@ -396,6 +402,8 @@ //update timing next_fire_time = world.time + fire_delay + accuracy = initial(accuracy) //Reset the gun's accuracy + if(muzzle_flash) set_light(0) @@ -482,11 +490,11 @@ // Certain statuses make it harder to aim, blindness especially. Same chances as melee, however guns accuracy uses multiples of 15. if(user.eye_blind) - accuracy -= 5 + P.accuracy -= 5 if(user.eye_blurry) - accuracy -= 2 + P.accuracy -= 2 if(user.confused) - accuracy -= 3 + P.accuracy -= 3 //accuracy bonus from aiming if (aim_targets && (target in aim_targets)) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 6fd294f928..604c936172 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -28,6 +28,7 @@ name = "practice laser carbine" desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." projectile_type = /obj/item/projectile/beam/practice + charge_cost = 48 cell_type = /obj/item/weapon/cell/device diff --git a/code/modules/projectiles/guns/energy/particle.dm b/code/modules/projectiles/guns/energy/particle.dm index dc5a6669c7..5638054647 100644 --- a/code/modules/projectiles/guns/energy/particle.dm +++ b/code/modules/projectiles/guns/energy/particle.dm @@ -93,20 +93,20 @@ user.visible_message("\The [user] fires \the [src], but the shot fizzles in the air!", "You fire \the [src], but the shot fizzles in the air!") power_supply.charge -= charge_cost playsound(src.loc, fire_sound, 100, 1) - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(2, 1, T) sparks.start() update_icon() else if (severity <= 80) //20% chance of shorting out and emptying the cell user.visible_message("\The [user] pulls the trigger, but \the [src] shorts out!", "You pull the trigger, but \the [src] shorts out!") power_supply.charge = 0 - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(2, 1, T) sparks.start() update_icon() else if (severity <= 90) //10% chance of breaking the gun user.visible_message("\The [user] pulls the trigger, but \the [src] erupts in a shower of sparks!", "You pull the trigger, but \the [src] bursts into a shower of sparks!") - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(2, 1, T) sparks.start() power_supply.charge = 0 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 8fbfc0e657..46988c9934 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -44,10 +44,12 @@ origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) modifystate = "floramut" self_recharge = 1 + var/decl/plantgene/gene = null firemodes = list( list(mode_name="induce mutations", projectile_type=/obj/item/projectile/energy/floramut, modifystate="floramut"), list(mode_name="increase yield", projectile_type=/obj/item/projectile/energy/florayield, modifystate="florayield"), + list(mode_name="induce specific mutations", projectile_type=/obj/item/projectile/energy/floramut/gene, modifystate="floramut"), ) /obj/item/weapon/gun/energy/floragun/afterattack(obj/target, mob/user, adjacent_flag) @@ -58,6 +60,28 @@ return ..() +/obj/item/weapon/gun/energy/floragun/verb/select_gene() + set name = "Select Gene" + set category = "Object" + set src in view(1) + + var/genemask = input("Choose a gene to modify.") as null|anything in plant_controller.plant_gene_datums + + if(!genemask) + return + + gene = plant_controller.plant_gene_datums[genemask] + + to_chat(usr, "You set the [src]'s targeted genetic area to [genemask].") + + return + +/obj/item/weapon/gun/energy/floragun/consume_next_projectile() + . = ..() + var/obj/item/projectile/energy/floramut/gene/G = . + if(istype(G)) + G.gene = gene + /obj/item/weapon/gun/energy/meteorgun name = "meteor gun" desc = "For the love of god, make sure you're aiming this the right way!" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 750164a260..f5a7460cc3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -173,7 +173,7 @@ return //roll to-hit - miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.evasion), 0) + miss_modifier = max(15*(distance-2) - round(15*accuracy) + miss_modifier + round(15*target_mob.get_evasion()), 0) var/hit_zone = get_zone_with_miss_chance(def_zone, target_mob, miss_modifier, ranged_attack=(distance > 1 || original != target_mob)) //if the projectile hits a target we weren't originally aiming at then retain the chance to miss var/result = PROJECTILE_FORCE_MISS diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 033b406510..ebb786c60e 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -38,7 +38,7 @@ playsound(src, 'sound/effects/snap.ogg', 50, 1) src.visible_message("\The [src] explodes in a bright flash!") - var/datum/effect/effect/system/spark_spread/sparks = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(2, 1, T) sparks.start() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index dd81d713fe..c8c26f5f39 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -121,6 +121,15 @@ else return 1 +/obj/item/projectile/energy/floramut/gene + name = "gamma somatoray" + icon_state = "energy2" + damage = 0 + damage_type = TOX + nodamage = 1 + check_armour = "energy" + var/decl/plantgene/gene = null + /obj/item/projectile/energy/florayield name = "beta somatoray" icon_state = "energy2" diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm index 523f688038..e9e58a03a4 100644 --- a/code/modules/random_map/automata/diona.dm +++ b/code/modules/random_map/automata/diona.dm @@ -38,7 +38,7 @@ if(1) new_growth = 2 var/obj/structure/diona/vines/existing = locate() in T - if(!istype(existing)) existing = PoolOrNew(/obj/structure/diona/vines, T) + if(!istype(existing)) existing = new /obj/structure/diona/vines(T) if(existing.growth < new_growth) existing.growth = new_growth existing.update_icon() @@ -161,11 +161,11 @@ switch(value) if(ARTIFACT_CHAR) - PoolOrNew(/obj/structure/diona/bulb,T) + new /obj/structure/diona/bulb(T) if(MONSTER_CHAR) spawn_diona_nymph(T) if(DOOR_CHAR) - var/obj/structure/diona/vines/V = PoolOrNew(/obj/structure/diona/vines,T) + var/obj/structure/diona/vines/V = new /obj/structure/diona/vines(T) V.growth = 3 V.update_icon() spawn(1) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 5909ed906f..d0be0469c1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -95,7 +95,7 @@ if(alien == IS_SKRELL) strength_mod *= 5 if(alien == IS_TAJARA) - strength_mod *= 1.75 + strength_mod *= 1.25 if(alien == IS_UNATHI) strength_mod *= 0.75 if(alien == IS_DIONA) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 566f3e20f9..88d059ed96 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -1799,6 +1799,7 @@ reagent_state = LIQUID color = "#7F00FF" strength = 10 + druggy = 15 glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy." @@ -2232,8 +2233,8 @@ glass_name = "special blend whiskey" glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." -/datum/reagent/ethanol/unathiliquor //Needs a better name - name = "Unathi Liquor" +/datum/reagent/ethanol/unathiliquor + name = "Redeemer's Brew" id = "unathiliquor" description = "This barely qualifies as a drink, and could give jetfuel a run for its money. Also known to cause feelings of euphoria and numbness." taste_description = "spiced numbness" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm new file mode 100644 index 0000000000..ddc0a5a411 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm @@ -0,0 +1,18 @@ +/datum/reagent/adranol + name = "Adranol" + id = "adranol" + description = "A mild sedative that calms the nerves and relaxes the patient." + taste_description = "milk" + reagent_state = SOLID + color = "#d5e2e5" + overdose = REAGENTS_OVERDOSE + +/datum/reagent/adranol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + if(M.confused) + M.Confuse(-8*removed) + if(M.eye_blurry) + M.eye_blurry = max(M.eye_blurry - 8*removed, 0) + if(M.jitteriness) + M.make_jittery(max(M.jitteriness - 8*removed,0)) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index feb29703f8..de7f707ac5 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -64,11 +64,14 @@ required_reagents = list("mutagen" = 3, "lipozine" = 2) result_amount = 5 - - - - - +/////////////////////////////////////////////////////////////////////////////////// +/// Other Drugs +/datum/chemical_reaction/adranol + name = "Adranol" + id = "adranol" + result = "adranol" + required_reagents = list("milk" = 2, "hydrogen" = 1, "potassium" = 1) + result_amount = 3 /////////////////////////////// //SLIME CORES BELOW HERE/////// diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index 3300eb91d6..2dcdd12605 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -407,6 +407,16 @@ ..() reagents.add_reagent("pwine", 100) +/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew + name = "Redeemer's Brew" + desc = "Just opening the top of this bottle makes you feel a bit tipsy. Not for the faint of heart." + icon_state = "redeemersbrew" + center_of_mass = list("x"=16, "y"=3) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/redeemersbrew/New() + ..() + reagents.add_reagent("unathiliquor", 100) + //////////////////////////JUICES AND STUFF /////////////////////// /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index e9e3c62dad..427d08d141 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -14,11 +14,19 @@ possible_transfer_amounts = null flags = OPENCONTAINER slot_flags = SLOT_BELT + var/reusable = 1 + var/used = 0 + var/filled = 0 + var/list/filled_reagents = list() -///obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty -// ..() -// reagents.add_reagent("tricordrazine", 30) -// return +/obj/item/weapon/reagent_containers/hypospray/New() + ..() + if(filled) + if(filled_reagents) + for(var/r in filled_reagents) + reagents.add_reagent(r, filled_reagents[r]) + update_icon() + return /obj/item/weapon/reagent_containers/hypospray/do_surgery(mob/living/carbon/M, mob/living/user) if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool @@ -53,6 +61,9 @@ admin_inject_log(user, M, src, contained, trans) user << "[trans] units injected. [reagents.total_volume] units remaining in \the [src]." + if(!reusable && !used) + used = !used + return /obj/item/weapon/reagent_containers/hypospray/autoinjector @@ -62,59 +73,52 @@ item_state = "autoinjector" amount_per_transfer_from_this = 5 volume = 5 + reusable = 0 + filled = 1 + filled_reagents = list("inaprovaline" = 5) -/obj/item/weapon/reagent_containers/hypospray/autoinjector/New() +/obj/item/weapon/reagent_containers/hypospray/autoinjector/on_reagent_change() ..() - reagents.add_reagent("inaprovaline", 5) update_icon() - return + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty + filled = 0 + filled_reagents = list() + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/used + used = 1 + filled_reagents = list() /obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob) ..() - if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled. + if(used) //Prevents autoinjectors to be refilled. flags &= ~OPENCONTAINER update_icon() return /obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon() - if(reagents.total_volume > 0) + if(!used && reagents.reagent_list.len) icon_state = "[initial(icon_state)]1" - else + else if(used) icon_state = "[initial(icon_state)]0" + else + icon_state = "[initial(icon_state)]2" /obj/item/weapon/reagent_containers/hypospray/autoinjector/examine(mob/user) ..(user) if(reagents && reagents.reagent_list.len) user << "It is currently loaded." - else + else if(used) user << "It is spent." + else + user << "It is currently unloaded." -/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting name = "clotting agent" - desc = "A rapid and safe way to administer clotting drugs by untrained or trained personnel." - icon_state = "autoinjector" - item_state = "autoinjector" - amount_per_transfer_from_this = 10 - volume = 10 + desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at treating bleeding wounds and internal bleeding." + filled_reagents = list("inaprovaline" = 5, "myelamine" = 10) -/obj/item/weapon/reagent_containers/hypospray/autoinjector/clotting/New() - ..() - reagents.remove_reagent("inaprovaline", 5) - reagents.add_reagent("myelamine", 10) - update_icon() - return - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed name = "bone repair injector" - desc = "A rapid and safe way to administer advanced drugs by untrained or trained personnel." - icon_state = "autoinjector" - item_state = "autoinjector" - amount_per_transfer_from_this = 10 - volume = 10 - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/bonemed/New() - ..() - reagents.remove_reagent("inaprovaline", 5) - reagents.add_reagent("osteodaxon", 10) - update_icon() - return \ No newline at end of file + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one excels at treating damage to bones." + filled_reagents = list("inaprovaline" = 5, "osteodaxon" = 10) diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index ec115715f6..4378468ff7 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -158,7 +158,7 @@ var/list/infomorph_emotions = list( if(prob(20)) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\red A shower of sparks spray from [src]'s inner workings.", 3, "\red You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) + M.show_message("A shower of sparks spray from \the [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) return src.death(0) /mob/living/silicon/infomorph/death(gibbed,var/message = "beeps once, then goes offline.") diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm index c94131b252..07adda0081 100644 --- a/code/modules/spells/spell_projectile.dm +++ b/code/modules/spells/spell_projectile.dm @@ -26,7 +26,7 @@ /obj/item/projectile/spell_projectile/before_move() if(proj_trail && src && src.loc) //pretty trails - var/obj/effect/overlay/trail = PoolOrNew(/obj/effect/overlay, src.loc) + var/obj/effect/overlay/trail = new /obj/effect/overlay(src.loc) trails += trail trail.icon = proj_trail_icon trail.icon_state = proj_trail_icon_state diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm index 083cf56462..f2ecec39cc 100644 --- a/code/modules/telesci/bscyrstal.dm +++ b/code/modules/telesci/bscyrstal.dm @@ -16,7 +16,7 @@ /obj/item/weapon/ore/bluespace_crystal/attack_self(mob/user) user.visible_message("[user] crushes [src]!", "You crush [src]!") - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(5, 1, get_turf(src)) s.start() blink_mob(user) @@ -30,7 +30,7 @@ if(!..()) // not caught in mid-air visible_message("[src] fizzles and disappears upon impact!") var/turf/T = get_turf(hit_atom) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(5, 1, T) s.start() if(isliving(hit_atom)) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index c721b7eeb4..6f5706afcf 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -128,7 +128,7 @@ /obj/machinery/computer/telescience/proc/sparks() if(telepad) - var/datum/effect/effect/system/spark_spread/s = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(5, 1, get_turf(telepad)) s.start() else @@ -214,7 +214,7 @@ // use a lot of power use_power(trueDistance * 10000) - var/datum/effect/effect/system/spark_spread/S = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread() S.set_up(5, 1, get_turf(telepad)) S.start() @@ -229,7 +229,7 @@ temp_msg += "Data printed below." var/sparks = get_turf(target) - var/datum/effect/effect/system/spark_spread/Y = PoolOrNew(/datum/effect/effect/system/spark_spread) + var/datum/effect/effect/system/spark_spread/Y = new /datum/effect/effect/system/spark_spread() Y.set_up(5, 1, sparks) Y.start() diff --git a/code/modules/vehicles/Securitrain_vr.dm b/code/modules/vehicles/Securitrain_vr.dm index b1aa89d84b..01ff285ada 100644 --- a/code/modules/vehicles/Securitrain_vr.dm +++ b/code/modules/vehicles/Securitrain_vr.dm @@ -181,8 +181,8 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load - D << "\red \b You ran over [H]!" - visible_message("\red \The [src] ran over [H]!") + to_chat(D, "You ran over \the [H]!" + visible_message("\The [src] ran over \the [H]!") attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)") else diff --git a/code/modules/vehicles/rover_vr.dm b/code/modules/vehicles/rover_vr.dm index cbeda52eaf..aec7254bf7 100644 --- a/code/modules/vehicles/rover_vr.dm +++ b/code/modules/vehicles/rover_vr.dm @@ -180,8 +180,8 @@ if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load - D << "\red \b You ran over [H]!" - visible_message("\red \The [src] ran over [H]!") + to_chat(D, "You ran over \the [H]!") + visible_message("\The [src] ran over \the [H]!") attack_log += text("\[[time_stamp()]\] ran over [H.name] ([H.ckey]), driven by [D.name] ([D.ckey])") msg_admin_attack("[D.name] ([D.ckey]) ran over [H.name] ([H.ckey]). (JMP)") else diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 80eb2f1a44..4da307cb91 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -139,7 +139,7 @@ /obj/vehicle/emp_act(severity) var/was_on = on stat |= EMPED - var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc) + var/obj/effect/overlay/pulse2 = new /obj/effect/overlay(src.loc) pulse2.icon = 'icons/effects/effects.dmi' pulse2.icon_state = "empdisable" pulse2.name = "emp sparks" @@ -192,8 +192,8 @@ src.visible_message("\red [src] blows apart!", 1) var/turf/Tsec = get_turf(src) - PoolOrNew(/obj/item/stack/rods, Tsec) - PoolOrNew(/obj/item/stack/rods, Tsec) + new /obj/item/stack/rods(Tsec) + new /obj/item/stack/rods(Tsec) new /obj/item/stack/cable_coil/cut(Tsec) if(cell) diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index c9bd658e40..a94a563eb8 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -499,6 +499,12 @@ icon_state = "molenar-kitsune" ckeys_allowed = list("molenar") +/datum/sprite_accessory/tail/liquidfirefly_gazer + name = "gazer eyestalks (Liquidfirefly)" + desc = "" + icon_state = "liquidfirefly-eyestalks" + ckeys_allowed = list("liquidfirefly") + /datum/sprite_accessory/tail/miria_fluffdragon name = "fluffdragon wings+tail (Miria Masters)" desc = "" diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 2d00c07991..0836ef1891 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -330,8 +330,11 @@ P.ear_style = O.ear_style P.species = O.species P.custom_species = O.custom_species + P.species.create_organs(P) //This is the only way to make it so Unathi TF doesn't result in people dying from organ rejection. for(var/obj/item/organ/I in P.organs) //This prevents organ rejection I.species = O.species + for(var/obj/item/organ/I in P.internal_organs) //This prevents organ rejection + I.species = O.species for(var/obj/item/organ/external/Z in P.organs)//Just in case. Z.sync_colour_to_human(P) P << "You lose sensation of your body, feeling only the warmth of everything around you... " @@ -399,7 +402,10 @@ P.ear_style = O.ear_style P.species = O.species P.custom_species = O.custom_species - for(var/obj/item/organ/I in P.organs) //This prevents organ rejection + P.species.create_organs(P) + for(var/obj/item/organ/I in P.organs) + I.species = O.species + for(var/obj/item/organ/I in P.internal_organs) I.species = O.species for(var/obj/item/organ/external/Z in P.organs) Z.sync_colour_to_human(P) @@ -429,7 +435,10 @@ P.tail_style = O.tail_style P.ear_style = O.ear_style P.species = O.species - for(var/obj/item/organ/I in P.organs) //This prevents organ rejection + P.species.create_organs(P) + for(var/obj/item/organ/I in P.organs) + I.species = O.species + for(var/obj/item/organ/I in P.internal_organs) I.species = O.species for(var/obj/item/organ/external/Z in P.organs) Z.sync_colour_to_human(P) @@ -527,7 +536,10 @@ P.g_eyes = O.g_eyes P.b_eyes = O.b_eyes - for(var/obj/item/organ/I in P.organs) //This prevents organ rejection + P.species.create_organs(P) + for(var/obj/item/organ/I in P.organs) + I.species = O.species + for(var/obj/item/organ/I in P.internal_organs) I.species = O.species for(var/obj/item/organ/external/Z in P.organs) Z.sync_colour_to_human(P) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 9bdfc730a7..a39eaa53d2 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -176,6 +176,24 @@ new /obj/item/weapon/gun/energy/netgun(src) new /obj/item/clothing/accessory/holster/leg(src) +//Aerowing:Sebastian Aji +/obj/item/weapon/storage/box/fluff/sebastian_aji + name = "Sebastian's Lumoco Arms P3 Box" + +/obj/item/weapon/storage/box/fluff/sebastian_aji/New() + ..() + new /obj/item/weapon/gun/projectile/pistol(src) + new /obj/item/ammo_magazine/mc9mm/flash(src) + new /obj/item/ammo_magazine/mc9mm/flash(src) + new /obj/item/fluff/permit/sebastian_aji(src) + +/obj/item/weapon/storage/box/fluff/briana_moore + name = "Briana's Derringer Box" + +/obj/item/weapon/storage/box/fluff/briana_moore/New() + ..() + new /obj/item/weapon/gun/projectile/derringer(src) + new /obj/item/fluff/permit/briana_moore(src) /* Swimsuits, for general use, to avoid arriving to work with your swimsuit. */ diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 6861db164f..254c6204b4 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -774,6 +774,7 @@ else return 1 + /obj/item/clothing/under/rank/internalaffairs/fluff/joan desc = "The plain, professional attire of a Federation Law Enforcement Detective." name = "Federation Dress Shirt" @@ -1218,4 +1219,78 @@ Departamental Swimsuits, for general use icon = 'icons/vore/custom_clothes_vr.dmi' icon_override = 'icons/vore/custom_clothes_vr.dmi' icon_state = "batter" - item_state = "batter_mob" \ No newline at end of file + item_state = "batter_mob" + + +//samanthafyre:Kateryna Petrovitch +/obj/item/clothing/suit/armor/vest/wolftaur/kate + name = "Kat's Fox Taur Armor" + desc = "A set of security armor, light weight and easy to run in for a Taur, this item protects the \ + entire body." + icon = 'icons/mob/taursuits_vr.dmi' + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "katesuit" + item_state_slots = null + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf)) + if(icon_state == "katesuit") + return ..() + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "katesuit" + pixel_x = -16 + return ..() + else + H << "You need to have a wolf-taur half to wear this." + return 0 + +//samanthafyre:Kateryna Petrovitch +/obj/item/clothing/suit/space/void/engineering/kate + name = "Kat's Navy Engineer voidsuit" + desc = "Taur engineering voidsuit. Recolored navy blue and white. Slightly tweaked as well to \ + get close to having security voidsuit protection as possible with a slight reduction in movement \ + speed to compensate for custom padding and armor Kateryna made herself." + icon = 'icons/mob/taursuits_vr.dmi' + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "lilithsuit" + armor = list(melee = 40, bullet = 20, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf)) + if(icon_state == "lilithsuit") + return ..() + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "lilithsuit" + pixel_x = -16 + return ..() + else + H << "You need to have a wolf-taur half to wear this." + return 0 + +//samanthafyre:Kateryna Petrovitch +/obj/item/clothing/head/helmet/space/fluff/kate + name = "Kat's Navy Engineer Helmet" + desc = "A customized combat space helmet made for Kateryna. It uses a navy design as the base before it\ + was customized to suit the wearer's personality." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "lilithhelmet" + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "lilithhelmet" + light_overlay = "helmet_light" + + mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "samanthafyre") + H << "You try to fit on the helmet, but it doesn't fit." + return 0 + else + return 1 + +//Seiga: Alfonso Oak Telanor +/obj/item/clothing/glasses/sunglasses/fluff/alfonso + name = "cyborg visor" + desc = "Eyewear worn by a once famous Thunderdome competitor. Fo' shizzle." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "alfonso_visor" + icon_override = 'icons/vore/custom_onmob_vr.dmi' diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 1baed38a2f..9f06f6b383 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -629,6 +629,30 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie taurtype = /datum/sprite_accessory/tail/taur/feline/tempest no_message = "These saddlebags seem to be fitted for someone else, and keep slipping off!" +//WickedTempest: Chakat Tempest +/obj/item/weapon/implant/reagent_generator/tempest + generated_reagent = "milk" + usable_volume = 1000 + + empty_message = list("Your breasts are almost completely drained!") + full_message = list("Your teats feel heavy and swollen!") + emote_descriptor = list("squeezes milk", "tugs on Tempest's breasts, milking them") + self_emote_descriptor = list("squeeze") + random_emote = list("moos quietly") + assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_tempest + +/obj/item/weapon/implanter/reagent_generator/tempest + implant_type = /obj/item/weapon/implant/reagent_generator/tempest + +/mob/living/carbon/human/proc/use_reagent_implant_tempest() + set name = "Milk" + set desc = "Grab Tempest's nipples and milk them into a container! May cause blushing and groaning." + set category = "Object" + set src in view(1) + + do_reagent_implant(usr) + + //PontifexMinimus: Lucius/Lucia Null /obj/item/weapon/fluff/dragor_dot name = "supplemental battery" @@ -643,6 +667,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie else return + //The perfect adminboos device? /obj/item/device/perfect_tele name = "personal translocator" diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm index 017e57a29c..c23b537041 100644 --- a/code/modules/vore/fluffstuff/custom_permits_vr.dm +++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm @@ -129,4 +129,26 @@ The individual named above is licensed by the Nanotrasen Department of Civil Protection to carry one Mateba Model 6 Unica handgun with stun/rubber/flash ammo. - This license expires on 01/Mar/2562 and must be renewed by CentCom prior to this date."} \ No newline at end of file + This license expires on 01/Mar/2562 and must be renewed by CentCom prior to this date."} + +// aerowing:Sebastian Aji +/obj/item/fluff/permit/sebastian_aji + name = "Sebastian Aji's Sidearm Permit" + desc = {" + NAME: Sebastian Aji | RACE: Panthera Tigris | HOMEWORLD: Ahdomai, Siik'tajr + DOB: 19/Dec/2530 | HEIGHT: 198cm | SEX: Male + + The individual named above is licensed by the Nanotrasen Department of Civil Protection + to carry one Lumoco Arms P3 Whisper handgun with lethal/flash ammo. + This license expires on 17/Apr/2563 and must be renewed by CentCom prior to this date."} + +// luminescent_ring:Briana Moore +/obj/item/fluff/permit/briana_moore + name = "Briana Moore's Sidearm Permit" + desc = {" + NAME: Briana Moore | RACE: Angel | HOMEWORLD: Sanctum + DOB: 2538-07-11 | HEIGHT: 155cm | SEX: Female + + The individual named above is licensed by the Nanotrasen Department of Civil Protection + to carry one Derringer handgun with lethal ammo. + This license expires on 24/Apr/2563 and must be renewed by CentCom prior to this date."} \ No newline at end of file diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 3be0dfbca2..f6a4200654 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -244,7 +244,7 @@ apply_material_decorations = 0 if(23) apply_prefix = 0 - new_item = PoolOrNew(/obj/item/stack/rods, src.loc) + new_item = new /obj/item/stack/rods(src.loc) apply_image_decorations = 0 apply_material_decorations = 0 if(24) diff --git a/code/modules/xenobio2/mob/xeno procs.dm b/code/modules/xenobio2/mob/xeno procs.dm index b72b1567fb..03fde9efc8 100644 --- a/code/modules/xenobio2/mob/xeno procs.dm +++ b/code/modules/xenobio2/mob/xeno procs.dm @@ -6,6 +6,7 @@ Proc for metabolism Proc for mutating Procs for copying speech, if applicable Procs for targeting +Divergence proc, used in mutation to make unique datums. */ /mob/living/simple_animal/xeno/proc/ProcessTraits() if(maleable >= MAX_MALEABLE) @@ -84,8 +85,14 @@ Procs for targeting return 1 //Everything worked out okay. return 0 + +/mob/living/simple_animal/xeno/proc/diverge() + var/datum/xeno/traits/newtraits = new() + newtraits.copy_traits(traitdat) + return newtraits /mob/living/simple_animal/xeno/proc/Mutate() + traitdat = diverge() nameVar = "mutated" if((COLORMUT & mutable)) traitdat.traits[TRAIT_XENO_COLOR] = "#" diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 910e45388f..081bd27416 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -12,4 +12,10 @@ natje - Daemon zalvine - Enochian rikaru19xjenkins - Xenochimera rikaru19xjenkins - Xenomorph Hybrid -seiga - Vox \ No newline at end of file +seiga - Vox +benemuel - Enochian +benemuel - Daemon +vorrarkul - Enochian +vorrarkul - Daemon +pontifexminimus - Enochian +pontifexminimus - Daemon diff --git a/config/custom_items.txt b/config/custom_items.txt index 688d77444b..accfcbd90d 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -68,6 +68,11 @@ character_name: Aronai Kadigan item_path: /obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai } +{ +ckey: aerowing +character_name: Sebastian Aji +item_path: /obj/item/weapon/storage/box/fluff/sebastian_aji +} # ######## B CKEYS { ckey: benemuel @@ -179,6 +184,13 @@ item_path: /obj/item/clothing/accessory/medal/bronze_heart # ######## F CKEYS # ######## G CKEYS # ######## H CKEYS + +{ +ckey: hottokeeki +character_name: Belle Day +item_path: /obj/item/weapon/gun/energy/sizegun +} + # ######## I CKEYS { @@ -317,6 +329,12 @@ item_path: /obj/item/device/pda_mod/fluff/kligor } # ######## L CKEYS +{ +ckey: luminescentring +character_name: Briana Moore +item_path: /obj/item/weapon/storage/box/fluff/briana_moore +} + # ######## M CKEYS { ckey: molenar @@ -390,6 +408,24 @@ item_path: /obj/item/fluff/permit/archermaximus } # ######## S CKEYS +{ +ckey: samanthafyre +character_name: Kateryna Petrovitch +item_path: /obj/item/clothing/suit/space/void/engineering/kate +} + +{ +ckey: samanthafyre +character_name: Kateryna Petrovitch +item_path: /obj/item/clothing/head/helmet/space/fluff/kate +} + +{ +ckey: samanthafyre +character_name: Kateryna Petrovitch +item_path: /obj/item/clothing/suit/armor/vest/wolftaur/kate +} + { ckey: sasoperative character_name: Joseph Skinner @@ -432,6 +468,12 @@ character_name: Scree item_path: /obj/item/clothing/glasses/omnihud/eng/meson/fluff/scree } +{ +ckey: seiga +character_name: Alfonso Oak Telanor +item_path: /obj/item/clothing/glasses/sunglasses/fluff/alfonso +} + { ckey: silencedmp5a5 character_name: Serdykov Antoz @@ -561,6 +603,12 @@ character_name: Chakat Tempest item_path: /obj/item/weapon/storage/backpack/saddlebag/tempest } +{ +ckey: wickedtemp +character_name: Chakat Tempest +item_path: /obj/item/weapon/implanter/reagent_generator/tempest +} + # ######## X CKEYS { diff --git a/html/changelog.html b/html/changelog.html index f4d1c782d5..92b938a65a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,10 +53,84 @@ -->
-

01 April 2017

+

05 May 2017

Anewbe updated:

    -
  • Wooden circlets can now be worn on the head.
  • +
  • Adds a cup for dice games, in the loadout.
  • +
  • Thermals now let you see in the dark.
  • +
+

Arokha updated:

+
    +
  • Sleepers now have a 'stasis' level setting, that will ignore varying numbers of life() ticks on the patient.
  • +
  • Stasis bags and Ody sleepers now use a fixed level of this new stasis system (ignore 2/3 life ticks).
  • +
  • You can escape from being asleep in a sleeper, similar to escaping from a cryotube.
  • +
  • You can now use grabs on sleepers to insert patients, same as scanners.
  • +
+

Datraen updated:

+
    +
  • Xenobiological traits are made unique on each mutate, avoiding mutating other mobs with same trait data.
  • +
+

Leshana updated:

+
    +
  • Resetting a fire alert will no longer open firedoors if atmos alert is in effect and vice versa
  • +
+

LorenLuke updated:

+
    +
  • Unfucks the screen bug on roundstart changelings.
  • +
  • Changeling now display 'alive' status on Medhuds properly.
  • +
  • Refactors changeling ranged stings not passing over tables. Can now pass over tables, any machinery (except doors), machine frames, and past closet subtypes.
  • +
  • You can now view an active video call by using the communicator in hand.
  • +
  • Guns on harm intent in aim mode will target, rather than shoot pointblank on first click.
  • +
  • You can now put handcuffs on yourself.
  • +
+ +

25 April 2017

+

Anewbe updated:

+
    +
  • Cultist armor now has better protection from strange energies.
  • +
  • Adds the ion pistol to the uplink.
  • +
  • The ion pistol can now be holstered.
  • +
  • Sprites on the smoking pipes should be fixed.
  • +
+

Atermonera updated:

+
    +
  • Brain type (Organic, cyborg, posi, or drone) is now displayed in all records.
  • +
+

Belsima updated:

+
    +
  • Changes relaymove() code in bodybags.
  • +
  • Above tweak used to allow exiting bodybag while in closed morgue tray.
  • +
+

Leshana updated:

+
    +
  • Implements footstep sound system and adds sounds to various floor types including plating, tiles, wood, and carpet.
  • +
+

LorenLuke updated:

+
    +
  • Allows people who are bucked to give/receive items.
  • +
  • Can click-drag people onto chairs/beds from 1 tile away to buckle them.
  • +
  • Allows you to place tape masks/restraints back on the roll (roll is still infinite).
  • +
  • Fixes ventcrawling for spiderbots/implants/etc.
  • +
+

Neerti updated:

+
    +
  • Drones will now spawn with an EIO-mandated ID card alongside their NT ID.
  • +
  • Fabricate Clothing for Changelings costs one point instead of two, and is fabricated twice as fast.
  • +
  • Dead changelings can no longer hear deadchat or freely ghost.
  • +
  • Shrieks now share a 10 second cooldown.
  • +
  • Lings cannot transform or shriek inside containers such as closets and pipes.
  • +
  • Regen. Stasis timer adjusted to be between 2 to 4 minutes.
  • +
  • Visible Camo. should end if the user is stunned.
  • +
  • Visible Camo. now blocks AI tracking when active.
  • +
  • Recursive Visible Camo. no longer gives true invis.
  • +
  • Recursive Visible Camo. will allow the changeling to run while cloaked instead.
  • +
  • Ling chemical meter on HUD now has a blinking exclaimation mark if below 20 chemicals, to warn that they cannot revive if they should die while still below 20.
  • +
+

Yoshax updated:

+
    +
  • Tape color is different now. Security tape is red rather than yellow, Engineering tape remains yellow and Atmos tape is a lighter cyan rather than blue.
  • +
+

19 April 2017

Anewbe updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9ade78534e..d68e6427ad 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3451,3 +3451,71 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Yoshax: - bugfix: Water such as the pool will no longer apply fire stacks when you enter, meaning you will no longer be flammable from swimming. +2017-04-25: + Anewbe: + - rscadd: Cultist armor now has better protection from strange energies. + - rscadd: Adds the ion pistol to the uplink. + - tweak: The ion pistol can now be holstered. + - bugfix: Sprites on the smoking pipes should be fixed. + Atermonera: + - rscadd: Brain type (Organic, cyborg, posi, or drone) is now displayed in all records. + Belsima: + - tweak: Changes relaymove() code in bodybags. + - bugfix: Above tweak used to allow exiting bodybag while in closed morgue tray. + Leshana: + - rscadd: Implements footstep sound system and adds sounds to various floor types + including plating, tiles, wood, and carpet. + LorenLuke: + - bugfix: Allows people who are bucked to give/receive items. + - tweak: Can click-drag people onto chairs/beds from 1 tile away to buckle them. + - tweak: Allows you to place tape masks/restraints back on the roll (roll is still + infinite). + - bugfix: Fixes ventcrawling for spiderbots/implants/etc. + Neerti: + - rscadd: Drones will now spawn with an EIO-mandated ID card alongside their NT + ID. + - tweak: Fabricate Clothing for Changelings costs one point instead of two, and + is fabricated twice as fast. + - tweak: Dead changelings can no longer hear deadchat or freely ghost. + - tweak: Shrieks now share a 10 second cooldown. + - tweak: Lings cannot transform or shriek inside containers such as closets and + pipes. + - tweak: Regen. Stasis timer adjusted to be between 2 to 4 minutes. + - tweak: Visible Camo. should end if the user is stunned. + - rscadd: Visible Camo. now blocks AI tracking when active. + - rscdel: Recursive Visible Camo. no longer gives true invis. + - rscadd: Recursive Visible Camo. will allow the changeling to run while cloaked + instead. + - rscadd: Ling chemical meter on HUD now has a blinking exclaimation mark if below + 20 chemicals, to warn that they cannot revive if they should die while still + below 20. + Yoshax: + - tweak: Tape color is different now. Security tape is red rather than yellow, Engineering + tape remains yellow and Atmos tape is a lighter cyan rather than blue. +2017-05-05: + Anewbe: + - rscadd: Adds a cup for dice games, in the loadout. + - rscadd: Thermals now let you see in the dark. + Arokha: + - rscadd: Sleepers now have a 'stasis' level setting, that will ignore varying numbers + of life() ticks on the patient. + - tweak: Stasis bags and Ody sleepers now use a fixed level of this new stasis system + (ignore 2/3 life ticks). + - tweak: You can escape from being asleep in a sleeper, similar to escaping from + a cryotube. + - rscadd: You can now use grabs on sleepers to insert patients, same as scanners. + Datraen: + - bugfix: Xenobiological traits are made unique on each mutate, avoiding mutating + other mobs with same trait data. + Leshana: + - bugfix: Resetting a fire alert will no longer open firedoors if atmos alert is + in effect and vice versa + LorenLuke: + - Bugfix: Unfucks the screen bug on roundstart changelings. + - bugfix: Changeling now display 'alive' status on Medhuds properly. + - tweak: Refactors changeling ranged stings not passing over tables. Can now pass + over tables, any machinery (except doors), machine frames, and past closet subtypes. + - bugfix: You can now view an active video call by using the communicator in hand. + - tweak: Guns on harm intent in aim mode will target, rather than shoot pointblank + on first click. + - bugfix: You can now put handcuffs on yourself. diff --git a/html/changelogs/Anewbe - CultRobesEnergy.yml b/html/changelogs/Anewbe - CultRobesEnergy.yml deleted file mode 100644 index 1d865cb090..0000000000 --- a/html/changelogs/Anewbe - CultRobesEnergy.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Cultist armor now has better protection from strange energies." diff --git a/html/changelogs/Anewbe - Ion Pistol.yml b/html/changelogs/Anewbe - Ion Pistol.yml deleted file mode 100644 index efc5c77c0e..0000000000 --- a/html/changelogs/Anewbe - Ion Pistol.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Anewbe - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Adds the ion pistol to the uplink." - - tweak: "The ion pistol can now be holstered. \ No newline at end of file diff --git a/html/changelogs/Atermonera - Records.yml b/html/changelogs/Atermonera - Records.yml deleted file mode 100644 index 9b66e57129..0000000000 --- a/html/changelogs/Atermonera - Records.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Atermonera - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Brain type (Organic, cyborg, posi, or drone) is now displayed in all records." diff --git a/html/changelogs/Leshana-footstep-sounds.yml b/html/changelogs/Leshana-footstep-sounds.yml deleted file mode 100644 index 2e0045dd90..0000000000 --- a/html/changelogs/Leshana-footstep-sounds.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Leshana -delete-after: True -changes: - - rscadd: "Implements footstep sound system and adds sounds to various floor types including plating, tiles, wood, and carpet." diff --git a/html/changelogs/LorenLuke - Bodybags.yml b/html/changelogs/LorenLuke - Bodybags.yml deleted file mode 100644 index e9dbd37406..0000000000 --- a/html/changelogs/LorenLuke - Bodybags.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Belsima - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Changes relaymove() code in bodybags." - - bugfix: "Above tweak used to allow exiting bodybag while in closed morgue tray." diff --git a/html/changelogs/LorenLuke - Buckle-Give.yml b/html/changelogs/LorenLuke - Buckle-Give.yml deleted file mode 100644 index 1332c7c576..0000000000 --- a/html/changelogs/LorenLuke - Buckle-Give.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: LorenLuke - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "Allows people who are bucked to give/receive items." diff --git a/html/changelogs/LorenLuke - Bucklechanges.yml b/html/changelogs/LorenLuke - Bucklechanges.yml deleted file mode 100644 index 771cce1148..0000000000 --- a/html/changelogs/LorenLuke - Bucklechanges.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: LorenLuke - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Can click-drag people onto chairs/beds from 1 tile away to buckle them." diff --git a/html/changelogs/LorenLuke - Tape.yml b/html/changelogs/LorenLuke - Tape.yml deleted file mode 100644 index 42135bb9ca..0000000000 --- a/html/changelogs/LorenLuke - Tape.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: LorenLuke - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Allows you to place tape masks/restraints back on the roll (roll is still infinite)." diff --git a/html/changelogs/Neerti-DroneID.yml b/html/changelogs/Neerti-DroneID.yml deleted file mode 100644 index 15837f65b8..0000000000 --- a/html/changelogs/Neerti-DroneID.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Neerti - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Drones will now spawn with an EIO-mandated ID card alongside their NT ID." diff --git a/html/changelogs/Anewbe - Smoking Pipes.yml b/html/changelogs/SiegDerMaus-Newbob.yml similarity index 94% rename from html/changelogs/Anewbe - Smoking Pipes.yml rename to html/changelogs/SiegDerMaus-Newbob.yml index 33ebbe8158..5a44ee0fd5 100644 --- a/html/changelogs/Anewbe - Smoking Pipes.yml +++ b/html/changelogs/SiegDerMaus-Newbob.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: SiegDerMaus # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "Sprites on the smoking pipes should be fixed." + - rscadd: "Adds one new haircut, a chin-length bob." diff --git a/html/changelogs/LorenLuke - Ventcrawl.yml b/html/changelogs/Yosh-Hair.yml similarity index 94% rename from html/changelogs/LorenLuke - Ventcrawl.yml rename to html/changelogs/Yosh-Hair.yml index ad43257fdc..95f98e9b35 100644 --- a/html/changelogs/LorenLuke - Ventcrawl.yml +++ b/html/changelogs/Yosh-Hair.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: LorenLuke +author: Yosh # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "Fixes ventcrawling for spiderbots/implants/etc." + - rscadd: "Ports a bunch of hair from Bay. Knock yourself out." diff --git a/html/changelogs/Yoshax-Tape.yml b/html/changelogs/Yoshax-Tape.yml deleted file mode 100644 index ffc7f56037..0000000000 --- a/html/changelogs/Yoshax-Tape.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Yoshax - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Tape color is different now. Security tape is red rather than yellow, Engineering tape remains yellow and Atmos tape is a lighter cyan rather than blue." \ No newline at end of file diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 6657457344..1f4bd4a68f 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 9bc29db45f..ab3dac1df9 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 9b4431a620..253821118e 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi new file mode 100644 index 0000000000..70f3b98db2 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_monitor.dmi differ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 8b56dfe339..8658a01de4 100644 Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 8a4ce2c73e..02ffbf4e65 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/modifier_effects.dmi b/icons/mob/modifier_effects.dmi new file mode 100644 index 0000000000..ecb575c673 Binary files /dev/null and b/icons/mob/modifier_effects.dmi differ diff --git a/icons/mob/screen1.dmi b/icons/mob/screen1.dmi index 9a326ac8a4..809046036d 100644 Binary files a/icons/mob/screen1.dmi and b/icons/mob/screen1.dmi differ diff --git a/icons/mob/taursuits_vr.dmi b/icons/mob/taursuits_vr.dmi index af470bb546..afeb27a7c9 100644 Binary files a/icons/mob/taursuits_vr.dmi and b/icons/mob/taursuits_vr.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index cad42f3b4f..428ab27ad8 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 62580b1f9e..aa86484e22 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index d6de0e06ec..7e474e8249 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index ff4ea400ed..0e86367473 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 3669a4702e..a399164c59 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index f6a209b468..17a3c64cd4 100644 Binary files a/icons/obj/dice.dmi and b/icons/obj/dice.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index c70873ccc7..330915356a 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index a9a46f6046..e604b23f3f 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 8d927180f4..c585b842c2 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/icons/vore/custom_onmob_vr.dmi b/icons/vore/custom_onmob_vr.dmi index 64c43bb34c..8ff8c2f9d7 100644 Binary files a/icons/vore/custom_onmob_vr.dmi and b/icons/vore/custom_onmob_vr.dmi differ diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index ac55f908f4..2e8c6cad23 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -119,7 +119,7 @@ Used In File(s): \code\game\machinery\adv_med.dm
Organ{{:data.occupant.blood.percent}}%
-

Reagents

+

Blood Reagents

{{if data.occupant.reagents}} {{for data.occupant.reagents}} @@ -130,7 +130,20 @@ Used In File(s): \code\game\machinery\adv_med.dm {{/for}}
{{else}} -
No reagents detected.
+
No blood reagents detected.
+ {{/if}} +

Stomach Reagents

+ {{if data.occupant.ingested}} + + {{for data.occupant.ingested}} + + + + + {{/for}} +
{{:value.name}}:{{:value.amount}}
+ {{else}} +
No stomach reagents detected.
{{/if}}

External Organs

diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl index 49fb0ae8d7..7ee370e890 100644 --- a/nano/templates/sleeper.tmpl +++ b/nano/templates/sleeper.tmpl @@ -88,4 +88,12 @@
{{/if}} +
+
+ Stasis Level: +
+
+ {{:helper.link(data.stasis, null, {'change_stasis' : 1})}} +
+
{{/if}} diff --git a/vorestation.dme b/vorestation.dme index cf42c1ae8f..e2604679de 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -53,7 +53,6 @@ #include "code\_compatibility\509\type2type.dm" #include "code\_helpers\_global_objects.dm" #include "code\_helpers\atmospherics.dm" -#include "code\_helpers\datum_pool.dm" #include "code\_helpers\files.dm" #include "code\_helpers\game.dm" #include "code\_helpers\global_lists.dm" @@ -227,6 +226,7 @@ #include "code\datums\observation\~cleanup.dm" #include "code\datums\repositories\cameras.dm" #include "code\datums\repositories\crew.dm" +#include "code\datums\repositories\decls.dm" #include "code\datums\repositories\repository.dm" #include "code\datums\supplypacks\atmospherics.dm" #include "code\datums\supplypacks\contraband.dm" @@ -494,8 +494,6 @@ #include "code\game\gamemodes\technomancer\spells\aura\frost_aura.dm" #include "code\game\gamemodes\technomancer\spells\aura\shock_aura.dm" #include "code\game\gamemodes\technomancer\spells\aura\unstable_aura.dm" -#include "code\game\gamemodes\technomancer\spells\insert\corona.dm" -#include "code\game\gamemodes\technomancer\spells\insert\haste.dm" #include "code\game\gamemodes\technomancer\spells\insert\insert.dm" #include "code\game\gamemodes\technomancer\spells\insert\mend_burns.dm" #include "code\game\gamemodes\technomancer\spells\insert\mend_metal.dm" @@ -503,7 +501,10 @@ #include "code\game\gamemodes\technomancer\spells\insert\mend_wires.dm" #include "code\game\gamemodes\technomancer\spells\insert\mend_wounds.dm" #include "code\game\gamemodes\technomancer\spells\insert\purify.dm" -#include "code\game\gamemodes\technomancer\spells\insert\repel_missiles.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\corona.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\haste.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\modifier.dm" +#include "code\game\gamemodes\technomancer\spells\modifier\repel_missiles.dm" #include "code\game\gamemodes\technomancer\spells\projectile\beam.dm" #include "code\game\gamemodes\technomancer\spells\projectile\chain_lightning.dm" #include "code\game\gamemodes\technomancer\spells\projectile\force_missile.dm" @@ -870,7 +871,6 @@ #include "code\game\objects\items\weapons\cigs_lighters.dm" #include "code\game\objects\items\weapons\clown_items.dm" #include "code\game\objects\items\weapons\cosmetics.dm" -#include "code\game\objects\items\weapons\dice.dm" #include "code\game\objects\items\weapons\dna_injector.dm" #include "code\game\objects\items\weapons\explosives.dm" #include "code\game\objects\items\weapons\extinguisher.dm" @@ -948,6 +948,7 @@ #include "code\game\objects\items\weapons\implants\implantfreedom.dm" #include "code\game\objects\items\weapons\implants\implantlanguage.dm" #include "code\game\objects\items\weapons\implants\implantpad.dm" +#include "code\game\objects\items\weapons\implants\implantreagent_vr.dm" #include "code\game\objects\items\weapons\implants\implantuplink.dm" #include "code\game\objects\items\weapons\material\ashtray.dm" #include "code\game\objects\items\weapons\material\bats.dm" @@ -1500,6 +1501,7 @@ #include "code\modules\games\cah_white_cards.dm" #include "code\modules\games\cardemon.dm" #include "code\modules\games\cards.dm" +#include "code\modules\games\dice.dm" #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" #include "code\modules\genetics\side_effects.dm" @@ -1515,6 +1517,7 @@ #include "code\modules\hydroponics\seed_controller.dm" #include "code\modules\hydroponics\seed_datums.dm" #include "code\modules\hydroponics\seed_datums_vr.dm" +#include "code\modules\hydroponics\seed_gene_mut.dm" #include "code\modules\hydroponics\seed_machines.dm" #include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_packets.dm" @@ -2118,6 +2121,7 @@ #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Food-Drinks_vr.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine.dm" +#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Medicine_vr.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Other.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Toxins.dm" #include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents-Vore_vr.dm"