diff --git a/baystation12.dme b/baystation12.dme index bdbb2ffbcb..18ee361f93 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -397,6 +397,7 @@ #include "code\defines\procs\icon_procs_readme.dm" #include "code\defines\procs\logging.dm" #include "code\defines\procs\religion_name.dm" +#include "code\defines\procs\sd_Alert.dm" #include "code\defines\procs\station_name.dm" #include "code\defines\procs\statistics.dm" #include "code\defines\procs\syndicate_name.dm" diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 661fe74d9b..e2edcaac7a 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -133,15 +133,16 @@ proc/Airflow(zone/A, zone/B) else connected_turfs |= C.B - //Get lists of things that can be thrown across the room for each zone. - var/list/pplz = B.movables() - var/list/otherpplz = A.movables() + //Get lists of things that can be thrown across the room for each zone (assumes air is moving from zone B to zone A) + var/list/air_sucked = B.movables() + var/list/air_repelled = A.movables() if(n < 0) - var/list/temporary_pplz = pplz - pplz = otherpplz - otherpplz = temporary_pplz + //air is moving from zone A to zone B + var/list/temporary_pplz = air_sucked + air_sucked = air_repelled + air_repelled = temporary_pplz - for(var/atom/movable/M in pplz) + for(var/atom/movable/M in air_sucked) if(M.last_airflow > world.time - vsc.airflow_delay) continue @@ -166,7 +167,7 @@ proc/Airflow(zone/A, zone/B) spawn M.GotoAirflowDest(abs(n)/5) //Do it again for the stuff in the other zone, making it fly away. - for(var/atom/movable/M in otherpplz) + for(var/atom/movable/M in air_repelled) if(M.last_airflow > world.time - vsc.airflow_delay) continue @@ -240,12 +241,15 @@ atom/movable if(airflow_dest == loc) step_away(src,loc) if(ismob(src)) - if(src:nodamage) return + if(src:nodamage) + return if(istype(src, /mob/living/carbon/human)) - if(istype(src, /mob/living/carbon/human)) - if(src:buckled) return - if(src:shoes) - if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return + if(src:buckled) + return + if(src:shoes) + if(src:shoes.type == /obj/item/clothing/shoes/magboots) + if(src:shoes.flags & NOSLIP) + return src << "\red You are sucked away by airflow!" var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful. if(airflow_falloff < 1) @@ -266,9 +270,15 @@ atom/movable airflow_speed -= vsc.airflow_speed_decay if(airflow_speed > 7) if(airflow_time++ >= airflow_speed - 7) + if(od) + density = 0 sleep(1 * tick_multiplier) else + if(od) + density = 0 sleep(max(1,10-(airflow_speed+3)) * tick_multiplier) + if(od) + density = 1 if ((!( src.airflow_dest ) || src.loc == src.airflow_dest)) src.airflow_dest = locate(min(max(src.x + xo, 1), world.maxx), min(max(src.y + yo, 1), world.maxy), src.z) if ((src.x == 1 || src.x == world.maxx || src.y == 1 || src.y == world.maxy)) @@ -276,7 +286,8 @@ atom/movable if(!istype(loc, /turf)) return step_towards(src, src.airflow_dest) - if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown + if(ismob(src) && src:client) + src:client:move_delay = world.time + vsc.airflow_mob_slowdown airflow_dest = null airflow_speed = 0 airflow_time = 0 @@ -295,12 +306,15 @@ atom/movable if(airflow_dest == loc) step_away(src,loc) if(ismob(src)) - if(src:nodamage) return + if(src:nodamage) + return if(istype(src, /mob/living/carbon/human)) - if(istype(src, /mob/living/carbon/human)) - if(src:buckled) return - if(src:shoes) - if(src:shoes.type == /obj/item/clothing/shoes/magboots && src:shoes.flags & NOSLIP) return + if(src:buckled) + return + if(src:shoes) + if(src:shoes.type == /obj/item/clothing/shoes/magboots) + if(src:shoes.flags & NOSLIP) + return src << "\red You are pushed away by airflow!" var/airflow_falloff = 9 - ul_FalloffAmount(airflow_dest) //It's a fast falloff calc. Very useful. if(airflow_falloff < 1) @@ -331,7 +345,8 @@ atom/movable if(!istype(loc, /turf)) return step_towards(src, src.airflow_dest) - if(ismob(src) && src:client) src:client:move_delay = world.time + vsc.airflow_mob_slowdown + if(ismob(src) && src:client) + src:client:move_delay = world.time + vsc.airflow_mob_slowdown airflow_dest = null airflow_speed = 0 airflow_time = 0 diff --git a/code/ZAS/ZAS_Zones.dm b/code/ZAS/ZAS_Zones.dm index 2e897584a0..1121467013 100644 --- a/code/ZAS/ZAS_Zones.dm +++ b/code/ZAS/ZAS_Zones.dm @@ -36,7 +36,7 @@ zone if(!istype(T,/turf/simulated)) AddTurf(T) - //Generate the gas_mixture for use in this zone by using the average of the gases + //Generate the gas_mixture for use in txhis zone by using the average of the gases //defined at startup. air = new var/members = contents.len @@ -304,6 +304,13 @@ proc/ShareRatio(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) temp_avg = (A.temperature * full_heat_capacity + B.temperature * s_full_heat_capacity) / (full_heat_capacity + s_full_heat_capacity) +<<<<<<< HEAD +======= + if(sharing_lookup_table.len >= connecting_tiles) //6 or more interconnecting tiles will max at 42% of air moved per tick. + ratio = sharing_lookup_table[connecting_tiles] + ratio *= 3 + +>>>>>>> bc318a3c8e40f9a2eed179318e17f56ce828ab1e A.oxygen = max(0, (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg ) A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1-ratio) + nit_avg ) A.carbon_dioxide = max(0, (A.carbon_dioxide - co2_avg) * (1-ratio) + co2_avg ) @@ -366,17 +373,30 @@ proc/ShareSpace(datum/gas_mixture/A, list/unsimulated_tiles) size = max(1,A.group_multiplier) share_size = max(1,unsimulated_tiles.len) - full_oxy = A.oxygen * size - full_nitro = A.nitrogen * size - full_co2 = A.carbon_dioxide * size - full_plasma = A.toxins * size + //full_oxy = A.oxygen * size + //full_nitro = A.nitrogen * size + //full_co2 = A.carbon_dioxide * size + //full_plasma = A.toxins * size - full_heat_capacity = A.heat_capacity() * size + //full_heat_capacity = A.heat_capacity() * size +<<<<<<< HEAD oxy_avg = (full_oxy + unsim_oxygen * 4) / (size + share_size * 4) nit_avg = (full_nitro + unsim_nitrogen * 4) / (size + share_size * 4) co2_avg = (full_co2 + unsim_co2 * 4) / (size + share_size * 4) plasma_avg = (full_plasma + unsim_plasma * 4) / (size + share_size * 4) +======= + oxy_avg = unsim_oxygen//(full_oxy + unsim_oxygen) / (size + share_size) + nit_avg = unsim_nitrogen//(full_nitro + unsim_nitrogen) / (size + share_size) + co2_avg = unsim_co2//(full_co2 + unsim_co2) / (size + share_size) + plasma_avg = unsim_plasma//(full_plasma + unsim_plasma) / (size + share_size) + + temp_avg = unsim_temperature//(A.temperature * full_heat_capacity + unsim_temperature * unsim_heat_capacity) / (full_heat_capacity + unsim_heat_capacity) + + if(sharing_lookup_table.len >= unsimulated_tiles.len) //6 or more interconnecting tiles will max at 42% of air moved per tick. + ratio = sharing_lookup_table[unsimulated_tiles.len] + ratio *= 3 +>>>>>>> bc318a3c8e40f9a2eed179318e17f56ce828ab1e A.oxygen = max(0, (A.oxygen - oxy_avg) * (1-ratio) + oxy_avg ) A.nitrogen = max(0, (A.nitrogen - nit_avg) * (1-ratio) + nit_avg ) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index d3e3a6b2a3..7a4dc5f533 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -288,6 +288,13 @@ datum/shuttle_controller if(1) + // Just before it leaves, close the damn doors! + if(timeleft == 2 || timeleft == 1) + var/area/start_location = locate(/area/shuttle/escape/station) + for(var/obj/machinery/door/D in start_location) + spawn(0) + D.close() + if(timeleft>0) return 0 diff --git a/code/defines/procs/global_lists.dm b/code/defines/procs/global_lists.dm index 29e9ad28ad..dda5d364bd 100644 --- a/code/defines/procs/global_lists.dm +++ b/code/defines/procs/global_lists.dm @@ -10,6 +10,7 @@ var/global/list/client_list = list() //List of all clients, based on ckey var/global/list/cable_list = list() //Index for all cables, so that powernets don't have to look through the entire world all the time var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessory/facial_hair indexed by name +var/global/list/skin_styles_list = list() //stores /datum/sprite_accessory/skin indexed by name var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/landmarks_list = list() //list of all landmarks created @@ -26,12 +27,21 @@ var/global/list/landmarks_list = list() //list of all landmarks created for(var/path in paths) var/datum/sprite_accessory/hair/H = new path() hair_styles_list[H.name] = H + //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair for(var/path in paths) var/datum/sprite_accessory/facial_hair/H = new path() facial_hair_styles_list[H.name] = H + //Skin Styles - Initialise all /datum/sprite_accessory/skin into a list indexed by the name + //Check to make sure the icon file exists first + paths = typesof(/datum/sprite_accessory/skin) - /datum/sprite_accessory/skin + for(var/path in paths) + var/datum/sprite_accessory/skin/S = new path() + if(fexists("[S.icon].dmi")) + skin_styles_list[S.name] = S + proc/make_player_list()//Global proc that rebuilds the player list for(var/mob/p in player_list)//Clears out everyone that logged out if(!(p.client)) diff --git a/code/defines/procs/sd_Alert.dm b/code/defines/procs/sd_Alert.dm new file mode 100644 index 0000000000..c63cab8f8b --- /dev/null +++ b/code/defines/procs/sd_Alert.dm @@ -0,0 +1,168 @@ +/* sd_Alert library + by Shadowdarke (shadowdarke@byond.com) + + sd_Alert() is a powerful and flexible alternative to the built in BYOND + alert() proc. sd_Alert offers timed popups, unlimited buttons, custom + appearance, and even the option to popup without stealing keyboard focus + from the map or command line. + + Please see demo.dm for detailed examples. + +FORMAT + sd_Alert(who, message, title, buttons, default, duration, unfocus, \ + size, table, style, tag, select, flags) + +ARGUMENTS + who - the client or mob to display the alert to. + message - text message to display + title - title of the alert box + buttons - list of buttons + Default Value: list("Ok") + default - default button selestion + Default Value: the first button in the list + duration - the number of ticks before this alert expires. If not + set, the alert lasts until a button is clicked. + Default Value: 0 (unlimited) + unfocus - if this value is set, the popup will not steal keyboard + focus from the map or command line. + Default Value: 1 (do not take focus) + size - size of the popup window in px + Default Value: "300x200" + table - optional parameters for the HTML table in the alert + Default Value: "width=100% height=100%" (fill the window) + style - optional style sheet information + tag - lets you specify a certain tag for this sd_Alert so you may manipulate it + externally. (i.e. force the alert to close, change options and redisplay, + reuse the same window, etc.) + select - if set, the buttons will be replaced with a selection box with a number of + lines displayed equal to this value. + Default value: 0 (use buttons) + flags - optional flags effecting the alert display. These flags may be ORed (|) + together for multiple effects. + SD_ALERT_SCROLL = display a scrollbar + SD_ALERT_SELECT_MULTI = forces selection box display (instead of + buttons) allows the user to select multiple + choices. + SD_ALERT_LINKS = display each choice as a plain text link. + Any selection box style overrides this flag. + SD_ALERT_NOVALIDATE = don't validate responses + Default value: SD_ALERT_SCROLL + (button display with scroll bar, validate responses) +RETURNS + The text of the selected button, or null if the alert duration expired + without a button click. + +Version 1 changes (from version 0): +* Added the tag, select, and flags arguments, thanks to several suggestions from Foomer. +* Split the sd_Alert/Alert() proc into New(), Display(), and Response() to allow more + customization by developers. Primarily developers would want to use Display() to change + the display of active tagged windows + +*/ + + +#define SD_ALERT_SCROLL 1 +#define SD_ALERT_SELECT_MULTI 2 +#define SD_ALERT_LINKS 4 +#define SD_ALERT_NOVALIDATE 8 + +proc/sd_Alert(client/who, message, title, buttons = list("Ok"),\ + default, duration = 0, unfocus = 1, size = "300x200", \ + table = "width=100% height=100%", style, tag, select, flags = SD_ALERT_SCROLL) + + if(ismob(who)) + var/mob/M = who + who = M.client + if(!istype(who)) CRASH("sd_Alert: Invalid target:[who] (\ref[who])") + + var/sd_alert/T = locate(tag) + if(T) + if(istype(T)) del(T) + else CRASH("sd_Alert: tag \"[tag]\" is already in use by datum '[T]' (type: [T.type])") + T = new(who, tag) + if(duration) + spawn(duration) + if(T) del(T) + return + T.Display(message,title,buttons,default,unfocus,size,table,style,select,flags) + . = T.Response() + +sd_alert + var + client/target + response + list/validation + + Del() + target << browse(null,"window=\ref[src]") + ..() + + New(who, tag) + ..() + target = who + src.tag = tag + + Topic(href,params[]) + if(usr.client != target) return + response = params["clk"] + + proc/Display(message,title,list/buttons,default,unfocus,size,table,style,select,flags) + if(unfocus) spawn() target << browse(null,null) + if(istext(buttons)) buttons = list(buttons) + if(!default) default = buttons[1] + if(!(flags & SD_ALERT_NOVALIDATE)) validation = buttons.Copy() + + var/html = {"[title][style]\ +
[message]
"} + + if(select || (flags & SD_ALERT_SELECT_MULTI)) // select style choices + html += {"
\ + +
" + else if(flags & SD_ALERT_LINKS) // text link style + for(var/b in buttons) + var/list/L = list() + L["clk"] = b + var/html_string=list2params(L) + var/focus + if(b == default) focus = " ID=fcs" + html += "[html_encode(b)]\ +
" + else // button style choices + for(var/b in buttons) + var/list/L = list() + L["clk"] = b + var/html_string=list2params(L) + var/focus + if(b == default) focus = " ID=fcs" + html += " " + + html += "
" + + target << browse(html,"window=\ref[src];size=[size];can_close=0") + + proc/Response() + var/validated + while(!validated) + while(target && !response) // wait for a response + sleep(2) + + if(response && validation) + if(istype(response, /list)) + var/list/L = response - validation + if(L.len) response = null + else validated = 1 + else if(response in validation) validated = 1 + else response=null + else validated = 1 + spawn(2) del(src) + return response diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index bdd2d4c17d..2edbc78d12 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -21,6 +21,9 @@ // Doesn't necessarily trigger an event, but might. Returns 1 if it did. /proc/event() event = 1 + if(!sent_ninja_to_station) + choose_space_ninja() + return var/minutes_passed = world.time/600 @@ -50,12 +53,28 @@ possibleEvents["Appendicitis"] = medical_count * 50 if(security_count >= 1) possibleEvents["Prison Break"] = security_count * 50 + possibleEvents["Space Ninja"] = security_count * 10 // very low chance for space ninja event var/picked_event = pick(possibleEvents) var/chance = possibleEvents[picked_event] + var/base_chance = 0.4 + switch(player_list.len) + if(5 to 10) + base_chance = 0.6 + if(11 to 15) + base_chance = 0.7 + if(16 to 20) + base_chance = 0.8 + if(21 to 25) + base_chance = 0.9 + if(26 to 30) + base_chance = 1.0 + if(30 to 100000) + base_chance = 1.1 + // Trigger the event based on how likely it currently is. - if(!prob(chance * eventchance * player_list.len / 20)) // "normal" event chance at 20 players + if(!prob(chance * eventchance * base_chance)) // "normal" event chance at 20 players return 0 switch(picked_event) @@ -70,6 +89,9 @@ spawn_meteors() if("Blob") mini_blob_event() + if("Space Ninja") + //Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like. + choose_space_ninja() if("Radiation") high_radiation_event() if("Virus") diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index 2801807815..90ac38ca97 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -93,7 +93,33 @@ When I already created about 4 new objectives, this doesn't seem terribly import /var/global/toggle_space_ninja = 1//If ninjas can spawn or not. /var/global/sent_ninja_to_station = 0//If a ninja is already on the station. -/proc/space_ninja_arrival() +/proc/choose_space_ninja() + var/list/candidates = list() //list of candidate keys + for(var/mob/dead/observer/G in player_list) + if(G.client && ((G.client.inactivity/10)/60) <= 5 && G.client.be_spaceninja) + if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) + candidates += G + if(!candidates.len) return + candidates = shuffle(candidates)//Incorporating Donkie's list shuffle + + //loop over all viable candidates, giving them a popup asking if they want to be space ninja + var/mob/dead/observer/accepted_ghost + while(candidates.len && !accepted_ghost) + //ask a different random candidate + var/mob/dead/observer/G = pick(candidates) + //give the popup a 30 second timeout in case the player is AFK + if(sd_Alert(G, "A space ninja is about to spawn. Would you like to play as the ninja?", "Space Ninja", list("Yes","No"), "Yes", 300, 1, "350x125") == "Yes") + accepted_ghost = G + else + candidates -= G + + if(accepted_ghost) + //someone accepted + space_ninja_arrival(accepted_ghost) + +/proc/space_ninja_arrival(var/mob/dead/observer/G) + if(!G) + return choose_space_ninja() var/datum/game_mode/current_mode = ticker.mode var/datum/mind/current_mind @@ -137,19 +163,9 @@ Malf AIs/silicons aren't added. Monkeys aren't added. Messes with objective comp if(L.name == "carpspawn") spawn_list.Add(L) - - var/list/candidates = list() //list of candidate keys - for(var/mob/dead/observer/G in player_list) - if(G.client && !G.client.holder && ((G.client.inactivity/10)/60) <= 5) - if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) - candidates += G.key - if(!candidates.len) return - candidates = shuffle(candidates)//Incorporating Donkie's list shuffle - - //The ninja will be created on the right spawn point or at late join. var/mob/living/carbon/human/new_ninja = create_space_ninja(pick(spawn_list.len ? spawn_list : latejoin )) - new_ninja.key = pick(candidates) + new_ninja.key = G.ckey new_ninja.wear_suit:randomize_param()//Give them a random set of suit parameters. new_ninja.internal = new_ninja.s_store //So the poor ninja has something to breath when they spawn in spess. new_ninja.internals.icon_state = "internal1" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index ecb8ea81df..23fd8ab112 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -148,18 +148,6 @@ var/global/datum/controller/gameticker/ticker spawn(3000) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE - //setup vermin spawn areas - var/list/vermin_spawn_areas = list("/area/maintenance","/area/mine/maintenance","/area/crew_quarters/locker/locker_toilet","/area/crew_quarters/toilet") - vermin_spawn_turfs = new/list() - for(var/area_text in vermin_spawn_areas) - var/area_base_type = text2path(area_text) - for(var/area in typesof(area_base_type)) - var/list/area_turfs = get_area_turfs(area) - for(var/turf/T in area_turfs) - if(T.density) - area_turfs -= T - vermin_spawn_turfs.Add(area_turfs) - return 1 /datum/controller/gameticker diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index b12ab1f78f..f9b192f7e0 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -68,9 +68,6 @@ else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) - L.imp_in = H - L.implanted = 1 return 1 @@ -120,9 +117,6 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) - L.imp_in = H - L.implanted = 1 return 1 @@ -156,7 +150,4 @@ else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H) - L.imp_in = H - L.implanted = 1 return 1 diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e9dfd6a6a7..7790526dd7 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -154,7 +154,7 @@ update_desc() break user << desc - if(P.loc != src && !istype(P, /obj/item/weapon/cable_coil)) + if(P && P.loc != src && !istype(P, /obj/item/weapon/cable_coil)) user << "\red You cannot add that component to the machine!" diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 6dac559b94..1ebba1bc23 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -2,6 +2,7 @@ desc = "An aging combat exosuit utilized by the Nanotrasen corporation. Originally developed to combat hostile alien lifeforms." name = "Durand" icon_state = "durand" + initial_icon = "durand" step_in = 4 dir_in = 1 //Facing North. health = 400 diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 8fc2f5bf4d..dae8cd0698 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -2,6 +2,7 @@ desc = "A lightweight, security exosuit. Popular among private and corporate security." name = "Gygax" icon_state = "gygax" + initial_icon = "gygax" step_in = 3 dir_in = 1 //Facing North. health = 300 @@ -19,6 +20,7 @@ desc = "A lightweight exosuit used by Nanotrasen Death Squads. A significantly upgraded Gygax security mech." name = "Dark Gygax" icon_state = "darkgygax" + initial_icon = "darkgygax" health = 400 deflect_chance = 25 damage_absorption = list("brute"=0.6,"fire"=0.8,"bullet"=0.6,"laser"=0.5,"energy"=0.65,"bomb"=0.8) diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 62dcd59b49..bc35b987e1 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -2,6 +2,7 @@ desc = "Produced by \"Tyranny of Honk, INC\", this exosuit is designed as heavy clown-support. Used to spread the fun and joy of life. HONK!" name = "H.O.N.K" icon_state = "honker" + initial_icon = "honker" step_in = 2 health = 140 deflect_chance = 60 diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index b366b9e770..77e85890de 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -2,6 +2,7 @@ desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations." name = "Marauder" icon_state = "marauder" + initial_icon = "marauder" step_in = 5 health = 500 deflect_chance = 25 @@ -25,6 +26,7 @@ desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." name = "Seraph" icon_state = "seraph" + initial_icon = "seraph" operation_req_access = list(access_cent_creed) step_in = 3 health = 550 @@ -37,6 +39,7 @@ desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model." name = "Mauler" icon_state = "mauler" + initial_icon = "mauler" operation_req_access = list(access_syndicate) wreckage = /obj/effect/decal/mecha_wreckage/mauler diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index 6bcad8dab5..d063fdf80c 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -2,6 +2,7 @@ desc = "An exosuit which can only be described as 'WTF?'." name = "Phazon" icon_state = "phazon" + initial_icon = "phazon" step_in = 1 dir_in = 1 //Facing North. step_energy_drain = 3 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 23f23a8478..9efbba9db4 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -18,6 +18,7 @@ unacidable = 1 //and no deleting hoomans inside layer = MOB_LAYER //icon draw layer infra_luminosity = 15 //byond implementation is bugged. + var/initial_icon = "" //Mech type for resetting icon. var/can_move = 1 var/mob/living/carbon/occupant = null var/step_in = 10 //make a step in step_in/10 sec. @@ -678,6 +679,7 @@ /obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/mmi)) if(mmi_move_inside(W,user)) user << "[src]-MMI interface initialized successfuly" @@ -1025,7 +1027,7 @@ src.add_fingerprint(H) src.forceMove(src.loc) src.log_append_to_last("[H] moved in as pilot.") - src.icon_state = initial(icon_state) + src.icon_state = src.reset_icon() dir = dir_in playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) @@ -1086,7 +1088,7 @@ src.verbs -= /obj/mecha/verb/eject src.Entered(mmi_as_oc) src.Move(src.loc) - src.icon_state = initial(icon_state) + src.icon_state = src.reset_icon() dir = dir_in src.log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) @@ -1175,7 +1177,7 @@ src.occupant.canmove = 0 src.verbs += /obj/mecha/verb/eject src.occupant = null - src.icon_state = initial(icon_state)+"-open" + src.icon_state = src.reset_icon()+"-open" src.dir = dir_in return @@ -1662,6 +1664,9 @@ return 1 return 0 +/obj/mecha/proc/reset_icon() + icon_state = initial_icon + return icon_state ////////////////////////////////////////// //////// Mecha global iterators //////// @@ -1792,4 +1797,4 @@ //src.health = initial(src.health)/2.2 //src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return -*/ +*/ \ No newline at end of file diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index 621f70e5d1..379959925a 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -2,6 +2,7 @@ desc = "These exosuits are developed and produced by Vey-Med. (© All rights reserved)." name = "Odysseus" icon_state = "odysseus" + initial_icon = "odysseus" step_in = 2 max_temperature = 1500 health = 120 diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index 669d638cc4..0ea4d0b24b 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -2,6 +2,7 @@ desc = "Autonomous Power Loader Unit. The workhorse of the exosuit world." name = "APLU \"Ripley\"" icon_state = "ripley" + initial_icon = "ripley" step_in = 6 max_temperature = 1000 health = 200 @@ -19,6 +20,7 @@ desc = "Standart APLU chassis was refitted with additional thermal protection and cistern." name = "APLU \"Firefighter\"" icon_state = "firefighter" + initial_icon = "firefighter" max_temperature = 2500 health = 250 lights_power = 8 @@ -29,6 +31,7 @@ desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE" name = "DEATH-RIPLEY" icon_state = "deathripley" + initial_icon = "deathripley" step_in = 2 opacity=0 lights_power = 60 @@ -44,6 +47,7 @@ /obj/mecha/working/ripley/mining desc = "An old, dusty mining ripley." name = "APLU \"Miner\"" + initial_icon = "ripley" /obj/mecha/working/ripley/mining/New() ..() @@ -110,4 +114,16 @@ return +/obj/mecha/working/ripley/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/fluff/butcher_royce_1)) + src.icon_state = "titan" + src.initial_icon = "titan" + src.name = "APLU \"Titan's Fist\"" + src.desc = "This ordinary mining Ripley has been customized to look like a unit of the Titans Fist." + user << "You spend some quality time with the Ripley, customising it to look like a \"Titan's Fist\" APLU." + user.drop_item() + del(W) + return + else + ..() \ No newline at end of file diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 907af3cfe1..c519439237 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -8,7 +8,7 @@ ..() human - gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core) + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(1,1,1,1,1,1,1) New() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3662579f5c..79a60e0a79 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -95,7 +95,8 @@ "/obj/item/stack/medical", "/obj/item/device/flashlight/pen", "/obj/item/clothing/mask/surgical", - "/obj/item/clothing/gloves/latex" + "/obj/item/clothing/gloves/latex", + "/obj/item/weapon/reagent_containers/hypospray/autoinjector" ) @@ -153,4 +154,4 @@ storage_slots = 1 can_hold = list( "/obj/item/clothing/mask/luchador" - ) \ No newline at end of file + ) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index ce43e6e113..a49d6ade13 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -26,6 +26,7 @@ var/be_alien = 0 //Check if that guy wants to be an alien var/be_pai = 1 //Consider client when searching for players to recruit as a pAI var/be_syndicate = 1 //Consider client for late-game autotraitor + var/be_spaceninja = 0 var/activeslot = 1 //Default active slot! var/STFU_ghosts //80+ people rounds are fun to admin when text flies faster than airport security var/STFU_radio //80+ people rounds are fun to admin when text flies faster than airport security diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 8ddc7e68b1..c95c7b5db9 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -1,3 +1,4 @@ +hi // Add custom items you give to people here, and put their icons in custom_items.dmi // Remember to change 'icon = 'custom_items.dmi'' for items not using /obj/item/fluff as a base // Clothing item_state doesn't use custom_items.dmi. Just add them to the normal clothing files. @@ -66,10 +67,20 @@ desc = "A neatly folded handkerchief embroidered with a 'M'." icon_state = "maurice_bedford_1" +/obj/item/weapon/book/fluff/johnathan_falcian_1 + name = "sketchbook" + desc = "A small, well-used sketchbook." + icon = 'custom_items.dmi' + icon_state = "johnathan_notebook" + dat = "In the notebook there are numerous drawings of various crew-mates, locations, and scenes on the ship. They are of fairly good quality." + author = "Johnathan Falcian" + title = "Falcian's sketchbook" + ////////////////////////////////// ////////// Usable Items ////////// ////////////////////////////////// + /obj/item/weapon/pen/fluff/multi //spaceman96: Trenna Seber name = "multicolor pen" desc = "It's a cool looking pen. Lots of colors!" @@ -330,10 +341,17 @@ /obj/item/weapon/crowbar/fluff/zelda_creedy_1 //daaneesh: Zelda Creedy name = "Zelda's Crowbar" desc = "A pink crow bar that has an engraving that reads, 'To Zelda. Love always, Dawn'" - icon = 'icons/obj/custom_items.dmi' + icon = 'custom_items.dmi' icon_state = "zeldacrowbar" item_state = "crowbar" +////// Ripley customisation kit - Butchery Royce - MayeDay + +/obj/item/weapon/fluff/butcher_royce_1 + name = "Ripley customisation kit" + desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into a Titan's Fist worker mech." + icon = 'custom_items.dmi' + icon_state = "royce_kit" ////////////////////////////////// //////////// Clothing //////////// @@ -384,6 +402,19 @@ icon = 'custom_items.dmi' icon_state = "ian_colm_1" +////// Medical eyepatch - Thysse Ezinwa - Jadepython +/obj/item/clothing/glasses/eyepatch/fluff/thysse_1 + name = "medical eyepatch" + desc = "On the strap, EZINWA is written in white block letters." + +////// Safety Goggles - Arjun Chopra - MindPhyre - APPROVED +/obj/item/clothing/glasses/fluff/arjun_chopra_1 + name = "safety goggles" + desc = "A used pair of leather safety goggles." + icon = 'custom_items.dmi' + icon_state = "arjun_chopra" + item_state = "arjun_chopra" + //////////// Hats //////////// /obj/item/clothing/head/secsoft/fluff/swatcap //deusdactyl: James Girard @@ -500,6 +531,50 @@ item_state = "ara_bar_uniform" color = "ara_bar_uniform" +/////// NT-SID Suit //Zuhayr: Jane Doe + +/obj/item/clothing/under/fluff/jane_sidsuit + name = "NT-SID jumpsuit" + desc = "A NanoTrasen Synthetic Intelligence Division jumpsuit, issued to 'volunteers'. On other people it looks fine, but right here a scientist has noted: on you it looks stupid." + + icon = 'icons/obj/custom_items.dmi' + icon_state = "jane_sid_suit" + item_state = "jane_sid_suit" + color = "jane_sid_suit" + has_sensor = 2 + sensor_mode = 3 + flags = FPRINT | TABLEPASS + +//Suit roll-down toggle. +/obj/item/clothing/under/fluff/jane_sidsuit/verb/toggle_zipper() + set name = "Toggle Jumpsuit Zipper" + set category = "Object" + set src in usr + + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + if(src.icon_state == "jane_sid_suit_down") + src.color = "jane_sid_suit" + usr << "You zip up the [src]." + else + src.color = "jane_sid_suit_down" + usr << "You unzip and roll down the [src]." + + src.icon_state = "[color]" + src.item_state = "[color]" + usr.update_inv_w_uniform() + +////// Wyatt's Ex-Commander Jumpsuit - RawrTaicho +/obj/item/clothing/under/fluff/wyatt_1 + + name = "ex-commander jumpsuit" + desc = "A standard Central Command Engineering Commander jumpsuit tailored to fight the wearer tightly. It has a Medal of Service pinned onto the left side of it." + icon = 'custom_items.dmi' + icon_state = "wyatt_uniform" + item_state = "wyatt_uniform" + color = "wyatt_uniform" + //////////// Masks //////////// /* @@ -522,6 +597,41 @@ flags = FPRINT|TABLEPASS w_class = 1 +////// Small locket - Altair An-Nasaqan - Serithi + +/obj/item/clothing/tie/fluff/altair_locket + name = "small locket" + desc = "A small golden locket attached to an Ii'rka-reed string. Inside the locket is a holo-picture of a female Tajaran, and an inscription writtin in Siik'mas." + icon = 'custom_items.dmi' + icon_state = "altair_locket" + item_state = "altair_locket" + color = "altair_locket" + slot_flags = 0 + flags = FPRINT|TABLEPASS + w_class = 1 + slot_flags = SLOT_MASK + +////// Medallion - Nasir Khayyam - Jamini + +/obj/item/clothing/tie/fluff/nasir_khayyam_1 + name = "medallion" + desc = "This silvered medallion bears the symbol of the Hadii Clan of the Tajaran." + icon = 'custom_items.dmi' + icon_state = "nasir_khayyam_1" + flags = FPRINT|TABLEPASS + w_class = 1 + slot_flags = SLOT_MASK + +////// Emerald necklace - Ty Foster - Nega + +/obj/item/clothing/mask/mara_kilpatrick_1 + name = "emerald necklace" + desc = "A brass necklace with a green emerald placed at the end. It has a small inscription on the top of the chain, saying \'Foster\'" + icon = 'custom_items.dmi' + icon_state = "ty_foster" + flags = FPRINT|TABLEPASS + w_class = 1 + //////////// Shoes //////////// /obj/item/clothing/shoes/magboots/fluff/susan_harris_1 //sniperyeti: Susan Harris @@ -529,22 +639,6 @@ desc = "A colorful pair of magboots with the name Susan Harris clearly written on the back." icon = 'custom_items.dmi' icon_state = "atmosmagboots0" - toggle() - set name = "Toggle Magboots" - set category = "Object" - set src in usr - if(src.magpulse) - src.flags &= ~NOSLIP - src.slowdown = SHOES_SLOWDOWN - src.magpulse = 0 - icon_state = "atmosmagboots0" - usr << "You disable the mag-pulse traction system." - else - src.flags |= NOSLIP - src.slowdown = 2 - src.magpulse = 1 - icon_state = "atmosmagboots1" - usr << "You enable the mag-pulse traction system." //////////// Sets //////////// @@ -593,3 +687,13 @@ icon_state = "retpoluniform" color = "retpoluniform" +//////////// Weapons //////////// + +///// Colt Peacemaker - Ana Ka'Rimah - SueTheCake + +/obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker + + name = "Peacemaker" + desc = "A nickel-plated revolver with pearl grips. It has a certain Old West flair!" + icon = 'custom_items.dmi' + icon_state = "peacemaker" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 42e0f89d68..614aaec63b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -257,6 +257,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp client.be_pai = 1 src << "You will now be considered a viable candidate when a pAI device requests a new personality, effective until the end of this round." +/mob/dead/observer/verb/toggle_spaceninja_candidate() + set name = "Toggle Be Space Ninja Candidate" + set category = "Ghost" + set desc = "Determines whether you will be a candidate for when a new space ninja spawns. (toggle)" + if(client.be_spaceninja) + client.be_spaceninja = 0 + src << "You are now excluded from space ninja candidate lists until end of round." + else + client.be_spaceninja = 1 + src << "You are now included in space ninja candidate lists until end of round." + /mob/dead/observer/memory() set hidden = 1 src << "\red You are dead! You have no mind to store memory!" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 2005af2994..fd406e7222 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -21,7 +21,7 @@ var/move_delay_add = 0 // movement delay to add status_flags = CANPARALYSE - var/heal_rate = 5 + var/heal_rate = 1 var/plasma_rate = 5 var/oxygen_alert = 0 diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a366503ac5..0c25c79199 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -106,7 +106,7 @@ I kind of like the right click only--the window version can get a little confusi /mob/living/carbon/alien/humanoid/proc/neurotoxin(mob/target as mob in oview()) set name = "Spit Neurotoxin (50)" - set desc = "Spits neurotoxin at someone, paralyzing them for a short time." + set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear." set category = "Alien" if(powerc(50)) @@ -129,12 +129,12 @@ I kind of like the right click only--the window version can get a little confusi if(!istype(T, /turf)) return if (U == T) - usr.bullet_act(src, get_organ_target()) + usr.bullet_act(new /obj/item/projectile/neurotoxin(usr.loc), get_organ_target()) return if(!istype(U, /turf)) return - var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(usr.loc) + var/obj/item/projectile/neurotoxin/A = new /obj/item/projectile/neurotoxin(usr.loc) A.current = U A.yo = U.y - T.y diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 909bf25219..c67017d795 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -89,7 +89,8 @@ var/const/MAX_ACTIVE_TIME = 400 return /obj/item/clothing/mask/facehugger/throw_impact(atom/hit_atom) - Attach(hit_atom) + if(prob(25)) + Attach(hit_atom) return /obj/item/clothing/mask/facehugger/proc/Attach(M as mob) @@ -129,17 +130,21 @@ var/const/MAX_ACTIVE_TIME = 400 for(var/mob/O in viewers(target, null)) O.show_message("\red \b [src] tears [W] off of [target]'s face!", 1) - loc = target - layer = 20 - target.wear_mask = src - target.update_inv_wear_mask() + if(prob(75)) + loc = target + layer = 20 + target.wear_mask = src + target.update_inv_wear_mask() - GoIdle() //so it doesn't jump the people that tear it off + GoIdle() //so it doesn't jump the people that tear it off - if(!sterile) target.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings + if(!sterile) target.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings - spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME)) - Impregnate(target) + spawn(rand(MIN_IMPREGNATION_TIME,MAX_IMPREGNATION_TIME)) + Impregnate(target) + else + for(var/mob/O in viewers(target, null)) + O.show_message("\red \b [src] misses [target]'s face!", 1) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 939d78b0d6..6a189778d4 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -192,7 +192,7 @@ swap_hand() /mob/living/carbon/proc/help_shake_act(mob/living/carbon/M) - if (src.health > 0) + if (src.health > config.health_threshold_crit) if(src == M && istype(src, /mob/living/carbon/human)) var/mob/living/carbon/human/H = src src.visible_message( \ diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index acd9683094..b7f1acf08f 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -11,6 +11,14 @@ animation.icon = 'icons/mob/mob.dmi' animation.master = src + for(var/datum/organ/external/E in src.organs) + if(istype(E, /datum/organ/external/chest)) + continue + // Only make the limb drop if it's not too damaged + if(prob(100 - E.get_damage())) + // Override the current limb status and don't cause an explosion + E.droplimb(1,1) + flick("gibbed-h", animation) hgibs(loc, viruses, dna) @@ -100,4 +108,4 @@ /mob/living/carbon/human/proc/Drain() ChangeToHusk() mutations |= NOCLONE - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm index 5c35fe9bb7..29081bab34 100644 --- a/code/modules/mob/living/carbon/human/human_attackalien.dm +++ b/code/modules/mob/living/carbon/human/human_attackalien.dm @@ -42,19 +42,20 @@ apply_damage(damage, BRUTE, affecting, armor_block) if (damage >= 25) visible_message("\red [M] has wounded [src]!") - apply_effect(4, WEAKEN, armor_block) + apply_effect(rand(0.5,3), WEAKEN, armor_block) updatehealth() if("disarm") - var/randn = rand(1, 100) - if (randn <= 90) + if (prob(80)) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - Weaken(rand(10,15)) + Weaken(rand(0.5,3)) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has tackled down []!", M, src), 1) + if (prob(25)) + M.Weaken(rand(2,4)) else - if (randn <= 99) + if (prob(80)) playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) drop_item() for(var/mob/O in viewers(src, null)) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index db7342061c..fe14579d1e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -304,7 +304,7 @@ /obj/effect/equip_e/human/process() if (item) item.add_fingerprint(source) - if (!item) + else switch(place) if("mask") if (!( target.wear_mask )) @@ -541,7 +541,7 @@ It can still be worn/put on as normal. if (target.legcuffed) strip_item = target.legcuffed if("CPR") - if ((target.health >= -99.0 && target.health <= 0)) + if ((target.health > config.health_threshold_dead && target.health < config.health_threshold_crit)) var/suff = min(target.getOxyLoss(), 7) target.adjustOxyLoss(-suff) target.updatehealth() diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index 1b236500d6..78eaa36f47 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -12,6 +12,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "pAI candidate" = 1, // -- TLE // 7 "cultist" = IS_MODE_COMPILED("cult"), // 8 "infested monkey" = IS_MODE_COMPILED("monkey"), // 9 + "space ninja" = "true", // 9 ) var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours @@ -28,6 +29,7 @@ var/const/BE_ALIEN =(1<<6) var/const/BE_PAI =(1<<7) var/const/BE_CULTIST =(1<<8) var/const/BE_MONKEY =(1<<9) +var/const/BE_SPACENINJA=(1<<10) var/const/MAX_SAVE_SLOTS = 10 @@ -236,8 +238,8 @@ datum/preferences dat += "Rename slot - " dat += "Reload slot" - //column 1 - dat += "
" + //COLUMN 1 + dat += "
" dat += "Name: " dat += "[real_name] " @@ -263,41 +265,68 @@ datum/preferences dat += "[(sound_adminhelp)?"On":"Off"] toggle
" if(user.client.holder.level >= 5) - dat += "
OOC
" - dat += "Change color
__

" + dat += "
OOC color
__

" - dat += "
Occupation Choices
" - dat += "\tSet Preferences

" + dat += "\tOccupation Preferences
" if(jobban_isbanned(user, "Records")) dat += "You are banned from using character records.
" else - dat += "Character Records

" + dat += "Character Records
" - dat += "Flavor Text
" - dat += "Change
" + dat += "\tSet Skills ([GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])
" + + dat += "Set Flavor Text
" if(lentext(flavor_text) <= 40) - dat += "[flavor_text]" + if(!lentext(flavor_text)) + dat += "\[...\]" + else + dat += "[flavor_text]" else dat += "[copytext(flavor_text, 1, 37)]...
" dat += "
" - dat += "Skill Choices
" - dat += "\t[GetSkillClass(used_skillpoints)] ([used_skillpoints])
" - dat += "\tSet Skills

" - - //column 2 - dat += "
" //height='300px' - - dat += "" + + //COLUMN 2 + dat += "
Body " - dat += "(®)" + //antag dat += "
" + if(jobban_isbanned(user, "Syndicate")) + dat += "You are banned from antagonist roles." + src.be_special = 0 + else + var/n = 0 + for (var/i in special_roles) + if(special_roles[i]) //if mode is available on the server + if(jobban_isbanned(user, i)) + dat += "Be [i]: \[BANNED]
" + else if(i == "pai candidate") + if(jobban_isbanned(user, "pAI")) + dat += "Be [i]: \[BANNED]
" + else + dat += "Be [i]: [src.be_special&(1<
" + n++ + dat += "
" + dat += "" + + dat += "" - dat += "Limbs: Adjust Limbs
" + dat += "" + + dat += "
" + dat += "Body (®)
" dat += "Species: [species]
" dat += "Blood Type: [b_type]
" - dat += "Skin Tone: [-s_tone + 35]/220
" + dat += "Skin Tone: [-s_tone + 35]/220
" + dat += "Adjust Skin
" + dat += "Adjust Limbs
" + dat += "
Preview
" + dat += "
" + + //display limbs below + var/ind = 0 for(var/name in organ_data) + //world << "[ind] \ [organ_data.len]" var/status = organ_data[name] var/organ_name = null switch(name) @@ -319,11 +348,18 @@ datum/preferences organ_name = "right hand" if(status == "cyborg") - dat += "\tRobotical [organ_name] prothesis
" - if(status == "amputated") - dat += "\tAmputated [organ_name]
" - dat+="
" - + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name] prothesis" + else if(status == "amputated") + ++ind + if(ind > 1) + dat += ", " + dat += "\tAmputated [organ_name]" + if(ind) + dat += "\[...\]" + dat += "

" if(gender == MALE) dat += "Underwear: [underwear_m[underwear]]
" @@ -332,8 +368,6 @@ datum/preferences dat += "Backpack Type:
[backbaglist[backbag]]
" - dat += "
Preview
" - dat += "
Hair
" dat += "Change Color
__

" dat += "Style: [h_style]
" @@ -345,22 +379,7 @@ datum/preferences dat += "
Eyes
" dat += "Change Color
__
" - dat += "

" - if(jobban_isbanned(user, "Syndicate")) - dat += "You are banned from antagonist roles." - src.be_special = 0 - else - var/n = 0 - for (var/i in special_roles) - if(special_roles[i]) //if mode is available on the server - if(jobban_isbanned(user, i)) - dat += "Be [i]: \[BANNED]
" - else if(i == "pai candidate") - if(jobban_isbanned(user, "pAI")) - dat += "Be [i]: \[BANNED]
" - else - dat += "Be [i]: [src.be_special&(1<
" - n++ + dat += "
" dat += "
" dat += "
" @@ -1021,6 +1040,10 @@ datum/preferences if(second_limb) organ_data[second_limb] = "cyborg" + if("skin_style") + var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") + if(!skin_style_name) return + else switch(href_list["preference"]) @@ -1231,6 +1254,7 @@ datum/preferences C.be_alien = be_special & BE_ALIEN C.be_pai = be_special & BE_PAI C.be_syndicate = be_special & BE_TRAITOR + C.be_spaceninja = be_special & BE_SPACENINJA if(isnull(src.ghost_ears)) src.ghost_ears = 1 //There were problems where the default was null before someone saved their profile. C.ghost_ears = src.ghost_ears C.ghost_sight = src.ghost_sight diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 8bf5982eec..792e1abb14 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -331,3 +331,29 @@ name = "Tajaran Ears" icon_state = "tajears" species_allowed = list("Tajaran") + +//skin styles - WIP + +/datum/sprite_accessory/skin + human + name = "Default human skin" + icon = "human" + + human_tatt01 + name = "Tatt01 human skin" + icon = "human_tattoo1" + + tajaran + name = "Default tajaran skin" + icon = "tajaran" + species_allowed = list("Tajaran") + + soghun + name = "Default soghun skin" + icon = "soghun" + species_allowed = list("Soghun") + + skrell + name = "Default skrell skin" + icon = "skrell" + species_allowed = list("Skrell") diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm index 3cc082d179..640f199ac1 100644 --- a/code/modules/mob/screen.dm +++ b/code/modules/mob/screen.dm @@ -518,6 +518,7 @@ if ((!( L.stat ) && L.canmove && !( L.restrained() ))) var/resisting = 0 for(var/obj/O in L.requests) + L.requests.Remove(O) del(O) resisting++ for(var/obj/item/weapon/grab/G in usr.grabbed_by) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index ff624a0bae..d1c60d9bb6 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -29,7 +29,7 @@ dna = null O.dna.uni_identity = "00600200A00E0110148FC01300B009" //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8" - O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*13)]BB8" + O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8" O.loc = loc O.viruses = viruses viruses = list() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 57a71fbb5c..82530f3add 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -213,12 +213,22 @@ display round(lastgen) and plasmatank amount user << "\blue You open the access panel." else user << "\blue You close the access panel." - else if(istype(O, /obj/item/weapon/crowbar) && !open) + else if(istype(O, /obj/item/weapon/crowbar) && open) var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) for(var/obj/item/I in component_parts) if(I.reliability < 100) I.crit_fail = 1 I.loc = src.loc + while ( sheets > 0 ) + var/obj/item/stack/sheet/G = new sheet_path(src.loc) + + if ( sheets > 50 ) + G.amount = 50 + else + G.amount = sheets + + sheets -= G.amount + new_frame.state = 2 new_frame.icon_state = "box_1" del(src) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ab930dcfe5..de55322f00 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -36,7 +36,7 @@ var/damage = 10 var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = 0 //Determines if the projectile will skip any damage inflictions - var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb + var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid var/projectile_type = "/obj/item/projectile" var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile. //Effects diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 99be701f98..b9710358b0 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -124,4 +124,12 @@ else if (istype(target, /mob/living/carbon/)) M.show_message("\blue The radiation beam dissipates harmlessly through your body.") else - return 1 \ No newline at end of file + return 1 + +/obj/item/projectile/neurotoxin + name = "neurotoxin" + icon_state = "toxin" + damage = 5 + damage_type = TOX + weaken = 5 + flag = "bio" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 48f044c6cc..830fdaa319 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -6,8 +6,9 @@ name = "hypospray" desc = "The DeForest Medical Corporation hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients." icon = 'icons/obj/syringe.dmi' - item_state = "hypo" + item_state = "hypo1" icon_state = "hypo" + var/original_icon_state = "hypo" amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = null @@ -56,6 +57,7 @@ name = "autoinjector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." icon_state = "autoinjector" + original_icon_state = "autoinjector" item_state = "autoinjector" amount_per_transfer_from_this = 5 volume = 5 @@ -74,9 +76,9 @@ /obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon() if(reagents.total_volume > 0) - icon_state = "[initial(icon_state)]1" + icon_state = "[original_icon_state]1" else - icon_state = "[initial(icon_state)]0" + icon_state = "[original_icon_state]0" /obj/item/weapon/reagent_containers/hypospray/autoinjector/examine() ..() diff --git a/config/custom_items.txt b/config/custom_items.txt index e2203141e6..57fb10e5dc 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -21,7 +21,10 @@ furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 furlucis: Chal Appara: /obj/item/clothing/gloves/fluff/chal_appara_1 gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1 jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt +jamini: Nasir Khayyam: /obj/item/clothing/tie/fluff/nasir_khayyam_1 +jadepython: Thysse Ezinwa: /obj/item/clothing/glasses/eyepatch/fluff/thysse_1 kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1 +leon_the_killer: johnathan Falcian: /obj/item/weapon/clipboard/notebook/fluff/johnathan_falcian_1 leonheart11: Johann Erzatz: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask @@ -29,10 +32,12 @@ madmalicemccrea: Alice McCrea: /obj/item/clothing/head/welding/fluff/alice_mccre mangled: Li Matsuda: /obj/item/weapon/lighter/zippo/fluff/li_matsuda_1 maximumbob: Maurice Bedford: /obj/item/fluff/maurice_bedford_1 mcgulliver: Wox Derax: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/lithiumflask +mindphyre: Arjun Chopra: /obj/item/clothing/glasses/fluff/arjun_chopra_1 misterbook: Smoke Perkins: /obj/item/clothing/mask/cigarette/pipe misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran morrinn: Maye Day: /obj/item/weapon/storage/fluff/maye_daye_1 naples: Russell Vierson: /obj/item/weapon/lighter/zippo/fluff/naples_1 +nega10: Ty Foster: /obj/item/clothing/mask/mara_kilpatrick_1 nerezza: Asher Spock: /obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1 nerezza: Asher Spock: /obj/item/weapon/card/id/fluff/asher_spock_2 orangebottle: Lillian Levett: /obj/item/weapon/pen/fluff/fancypen @@ -40,11 +45,13 @@ orangebottle: Lilliana Reade: /obj/item/weapon/pen/fluff/fancypen paththegreat: Eli Stevens: /obj/item/weapon/pen/fluff/fountainpen phaux: Tian Krieger: /obj/item/clothing/under/fluff/tian_dress rawrtaicho: Riley Rohtin: /obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 +rawrtaicho: Wyatt Engstrom: /obj/item/clothing/under/fluff/wyatt_1 roaper: Ian Colm: /obj/item/weapon/card/id/fluff/ian_colm_1 roaper: Ian Colm: /obj/item/clothing/glasses/welding/fluff/ian_colm_2 rukral: Nashida Bisha'ra: /obj/item/weapon/reagent_containers/glass/beaker/large/fluff/nashida_bishara_1 searif: Yuki Matsuda: /obj/item/clothing/under/fluff/jumpsuitdown, /obj/item/clothing/head/welding/fluff/yuki_matsuda_1 searif: Ara Al-Jazari: /obj/item/clothing/under/rank/bartender/fluff/classy +serithi: Altair An-Nasaqan: /obj/item/clothing/tie/fluff/altair_locket sirribbit: /obj/item/weapon/clipboard/fluff/mcreary_journal sicktrigger: David Fanning: /obj/item/fluff/david_fanning_1 silentthunder: Val McNeil: /obj/item/fluff/val_mcneil_1 @@ -52,6 +59,7 @@ sniperyeti: Susan Harris: /obj/item/clothing/shoes/magboots/fluff/susan_harris_1 spaceman96: Trenna Seber: /obj/item/weapon/pen/fluff/multi, /obj/item/clothing/suit/labcoat/fluff/pink sparklysheep: Cado Keppel: /obj/item/weapon/fluff/cado_keppel_1 sparklysheep: Uzenwa Sissra: /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 +suethecake: Ana Ka'Rimah: /obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker staghorn: Mara Kilpatrick: /obj/item/clothing/mask/mara_kilpatrick_1 tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper thatoneguy: Hugo Cinderbatch: /obj/item/weapon/fluff/hugo_cinderbacth_1 @@ -62,3 +70,4 @@ tzefa: Wes Solari: /obj/item/fluff/wes_solari_1 vinceluk: Seth Sealis: /obj/item/clothing/suit/det_suit/fluff/graycoat whitellama: Ethan Way: /obj/item/fluff/ethan_way_1 whitewolf41: Jeremy Wolf: /obj/item/clothing/under/rank/security/fluff/jeremy_wolf_1 +zuhayr: Jane Doe: /obj/item/clothing/under/fluff/jane_sidsuit \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index 1c8f86afc9..1de473de9f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,14 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

December 3rd

+

Cael_Aislinn updated:

+
    +
  • Aliens have been significantly nerfed: neurotoxin is affected by bio protection suits, tackle stuns for much shorter time and facehuggers have a chance to fail when leaping.
  • +
+
+

23.11.12

CIB updated:

diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index eae6b002f3..97b4694885 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 1a5f94e5d5..8a2d55463f 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index ffac5f672c..1dacf1a823 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index f73d9ee81d..0c8d0aea6b 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index f530d9c8df..804a7bc5c2 100644 Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi index fc34fc30a0..a6d3b13773 100644 Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index afac25da28..fbc6af1ea0 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 2bc4f1ddf1..189ae9ecb0 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index 7ecb7dd33c..ae3f570aad 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ