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]"
+
+ 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 += "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 += " | "
+
+ //COLUMN 2
+ dat += ""
+ 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
|