[t]"
+ dat += "[t.name]"
else
- dat += "[t]"
+ dat += "[t.name]"
if(istype(t, /obj/item/stack))
var/obj/item/stack/S = t
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index ea51d07dbc6..f957a2d3a46 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -101,9 +101,11 @@
..()
/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- healthcheck()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ ..()
+ healthcheck()
+ return
/obj/machinery/bot/meteorhit()
src.explode()
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 2da2b7f1d9d..b1792a5a6b3 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -222,10 +222,10 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/process()
set background = BACKGROUND_ENABLED
- if (!src.on)
+ if (!src.on || src.disabled)
return
var/list/targets = list()
- for (var/mob/living/carbon/C in view(12,src)) //Let's find us a target
+ for (var/mob/living/carbon/C in view(9,src)) //Let's find us a target
var/threatlevel = 0
if ((C.stat) || (C.lying))
continue
@@ -818,14 +818,14 @@ Auto Patrol: []"},
projectile = /obj/item/projectile/energy/electrode
else if(lasercolor == "b")
if (src.emagged == 2)
- projectile = /obj/item/projectile/omnitag
+ projectile = /obj/item/projectile/lasertag
else
- projectile = /obj/item/projectile/bluetag
+ projectile = /obj/item/projectile/lasertag/bluetag
else if(lasercolor == "r")
if (src.emagged == 2)
- projectile = /obj/item/projectile/omnitag
+ projectile = /obj/item/projectile/lasertag
else
- projectile = /obj/item/projectile/redtag
+ projectile = /obj/item/projectile/lasertag/redtag
if (!( istype(U, /turf) ))
return
@@ -1008,7 +1008,7 @@ Auto Patrol: []"},
user << "Taser gun attached."
if(9)
- if(istype(W, /obj/item/weapon/cell))
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
build_step++
user << "You complete the ED-209."
var/turf/T = get_turf(src)
@@ -1020,24 +1020,26 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
- if((src.lasercolor == "b") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/redtag))
+ if(!disabled)
+ var/lasertag_check = 0
+ if((src.lasercolor == "b"))
+ if(istype(Proj, /obj/item/projectile/lasertag/redtag))
+ lasertag_check++
+ else if((src.lasercolor == "r"))
+ if(istype(Proj, /obj/item/projectile/lasertag/bluetag))
+ lasertag_check++
+ if(lasertag_check)
+ icon_state = "[lasercolor]ed2090"
src.disabled = 1
- qdel(Proj)
- sleep(100)
- src.disabled = 0
+ target = null
+ spawn(100)
+ src.disabled = 0
+ icon_state = "[lasercolor]ed2091"
+ return 1
else
- ..()
- else if((src.lasercolor == "r") && (src.disabled == 0))
- if(istype(Proj, /obj/item/projectile/bluetag))
- src.disabled = 1
- qdel(Proj)
- sleep(100)
- src.disabled = 0
- else
- ..()
+ ..(Proj)
else
- ..()
+ ..(Proj)
/obj/machinery/bot/ed209/bluetag/New()//If desired, you spawn red and bluetag bots easily
new /obj/machinery/bot/ed209(get_turf(src),null,"b")
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index c49a4df4105..47a26e226c5 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -48,7 +48,7 @@ var/global/mulebot_count = 0
var/auto_return = 1 // true if auto return to home beacon after unload
var/auto_pickup = 1 // true if auto-pickup at beacon
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
var/datum/wires/mulebot/wires = null
// the installed power cell
@@ -105,8 +105,8 @@ var/global/mulebot_count = 0
if(toggle_lock(user))
user << "\blue Controls [(locked ? "locked" : "unlocked")]."
- else if(istype(I,/obj/item/weapon/cell) && open && !cell)
- var/obj/item/weapon/cell/C = I
+ else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell)
+ var/obj/item/weapon/stock_parts/cell/C = I
user.drop_item()
C.loc = src
cell = C
@@ -293,7 +293,7 @@ var/global/mulebot_count = 0
if("cellinsert")
if(open && !cell)
- var/obj/item/weapon/cell/C = usr.get_active_hand()
+ var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
usr.drop_item()
cell = C
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 567cbfe5284..14a8fb54edc 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -8,7 +8,7 @@
idle_power_usage = 5
active_power_usage = 60
power_channel = EQUIP
- var/obj/item/weapon/cell/charging = null
+ var/obj/item/weapon/stock_parts/cell/charging = null
var/chargelevel = -1
proc
updateicon()
@@ -38,7 +38,7 @@
if(stat & BROKEN)
return
- if(istype(W, /obj/item/weapon/cell) && anchored)
+ if(istype(W, /obj/item/weapon/stock_parts/cell) && anchored)
if(charging)
user << "\red There is already a cell in the charger."
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index d2b7234cc47..631d2eb9700 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -262,6 +262,9 @@
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]",W))
return
+ if(exchange_parts(user, W))
+ return
+
default_deconstruction_crowbar(W)
if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 96c2f727546..e4c6e621fee 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -357,7 +357,7 @@
/obj/item/weapon/holo
- damtype = HALLOSS
+ damtype = STAMINA
/obj/item/weapon/holo/esword
desc = "May the force be with you. Sorta"
@@ -426,7 +426,7 @@
if((ishuman(hit_atom)))
var/mob/living/carbon/M = hit_atom
playsound(src, 'sound/items/dodgeball.ogg', 50, 1)
- M.apply_damage(10, HALLOSS)
+ M.apply_damage(10, STAMINA)
if(prob(5))
M.Weaken(3)
visible_message("\red [M] is knocked right off \his feet!", 3)
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 4e766b90087..b06a181fa9f 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -31,7 +31,7 @@
/obj/item/weapon/circuitboard/turbine_computer
name = "circuit board (Turbine Computer)"
build_path = /obj/machinery/computer/turbine_computer
- origin_tech = "programming=4;engineering=4;power=4"
+ origin_tech = "programming=4;engineering=4;powerstorage=4"
/obj/item/weapon/circuitboard/telesci_console
name = "circuit board (Telescience Console)"
build_path = /obj/machinery/computer/telescience
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 68c1f1204f0..bdf58f727dc 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -56,7 +56,8 @@
/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)
if(prob(Proj.damage))
- set_broken()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ set_broken()
..()
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index ba0111c70f5..c06bb4e015e 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -149,9 +149,10 @@
components += P
req_components[I]--
update_req_desc()
- break
+ return 1
if(!success)
user << "You cannot add that to the machine!"
+ return 0
//Machine Frame Circuit Boards
@@ -194,7 +195,7 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=4;powerstorage=5;engineering=5"
req_components = list(
"/obj/item/stack/cable_coil" = 5,
- "/obj/item/weapon/cell" = 5,
+ "/obj/item/weapon/stock_parts/cell" = 5,
"/obj/item/weapon/stock_parts/capacitor" = 1)
/obj/item/weapon/circuitboard/power_compressor
@@ -338,7 +339,7 @@ to destroy them and players will be able to make replacements.
"/obj/item/weapon/stock_parts/capacitor" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/weapon/cell" = 1)
+ "/obj/item/weapon/stock_parts/cell" = 1)
/obj/item/weapon/circuitboard/destructive_analyzer
@@ -453,7 +454,7 @@ obj/item/weapon/circuitboard/rdserver
origin_tech = "powerstorage=3;engineering=3"
req_components = list(
"/obj/item/weapon/stock_parts/capacitor" = 2,
- "/obj/item/weapon/cell" = 1,
+ "/obj/item/weapon/stock_parts/cell" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,)
// Telecomms circuit boards:
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 42f56558f80..51e9f040f10 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -233,6 +233,9 @@
node.update_icon()
return
+ if(exchange_parts(user, I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/atmospherics/unary/cryo_cell/open_machine()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 764857861de..5179e09843c 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -300,8 +300,8 @@ About the new airlock wires panel:
return
else if(user.hallucination > 50 && prob(10) && src.operating == 0)
user << "\red You feel a powerful shock course through your body!"
- user.halloss += 10
- user.stunned += 10
+ user.staminaloss += 50
+ user.stunned += 5
return
..(user)
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 8eeb0e0c0f0..8a9b225e5a8 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -130,7 +130,8 @@
/obj/machinery/door/window/bullet_act(var/obj/item/projectile/Proj)
if(Proj.damage)
- take_damage(round(Proj.damage / 2))
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ take_damage(round(Proj.damage / 2))
..()
//When an object is thrown at the window
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index 37281c501cd..25488f3a3ac 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -67,6 +67,9 @@
if(default_unfasten_wrench(user, O))
return
+ if(exchange_parts(user, O))
+ return
+
default_deconstruction_crowbar(O)
if(src.broken > 0)
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 94430c382ce..b3672caa522 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -116,6 +116,7 @@
item_quants[n]++
else
item_quants[n] = 1
+ item_quants = sortAssoc(item_quants)
/obj/machinery/smartfridge/attack_paw(mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 76f45444690..3a02819f8d2 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -319,3 +319,31 @@ Class Procs:
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
return 1
return 0
+
+/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
+ if(istype(W) && component_parts)
+ if(panel_open)
+ var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
+ var/P
+ for(var/obj/item/weapon/stock_parts/A in component_parts)
+ for(var/D in CB.req_components)
+ if(ispath(A.type, text2path(D)))
+ P = text2path(D)
+ break
+ for(var/obj/item/weapon/stock_parts/B in W.contents)
+ if(istype(B, P) && istype(A, P))
+ if(B.rating > A.rating)
+ W.remove_from_storage(B, src)
+ W.handle_item_insertion(A, 1)
+ component_parts -= A
+ component_parts += B
+ B.loc = null
+ user << "[A.name] replaced with [B.name]."
+ break
+ RefreshParts()
+ else
+ user << "Following parts detected in the machine:"
+ for(var/var/obj/item/C in component_parts)
+ user << " [C.name]"
+ return 1
+ return 0
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 0145f2b4b03..3671edddeaa 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -76,7 +76,7 @@
switch(E.type)
if(/obj/item/weapon/gun/energy/laser/bluetag)
- eprojectile = /obj/item/projectile/bluetag
+ eprojectile = /obj/item/projectile/lasertag/bluetag
lasercolor = "b"
req_access = list(access_maint_tunnels, access_theatre)
check_records = 0
@@ -87,7 +87,7 @@
shot_delay = 30
if(/obj/item/weapon/gun/energy/laser/redtag)
- eprojectile = /obj/item/projectile/redtag
+ eprojectile = /obj/item/projectile/lasertag/redtag
lasercolor = "r"
req_access = list(access_maint_tunnels, access_theatre)
check_records = 0
@@ -320,7 +320,8 @@
sleep(60)
attacked = 0
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
@@ -330,13 +331,13 @@
die() //the death process :(
if(lasercolor == "b" && disabled == 0)
- if(istype(Proj, /obj/item/projectile/redtag))
+ if(istype(Proj, /obj/item/projectile/lasertag/redtag))
disabled = 1
qdel(Proj)
sleep(100)
disabled = 0
if(lasercolor == "r" && disabled == 0)
- if(istype(Proj, /obj/item/projectile/bluetag))
+ if(istype(Proj, /obj/item/projectile/lasertag/bluetag))
disabled = 1
qdel(Proj)
sleep(100)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 60ada041f38..a4972ab05f1 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -24,7 +24,7 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
RefreshParts()
build_icon()
@@ -35,7 +35,7 @@
recharge_speed += C.rating * 100
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
repairs += M.rating - 1
- for(var/obj/item/weapon/cell/C in component_parts)
+ for(var/obj/item/weapon/stock_parts/cell/C in component_parts)
recharge_speed *= C.maxcharge / 10000
@@ -73,126 +73,14 @@
return attack_hand(user)
/obj/machinery/recharge_station/attackby(obj/item/P as obj, mob/user as mob)
- if (istype(P, /obj/item/weapon/card/id/))
- if (construct_op == 0)
- if (src.allowed(user))
- if (emagged == 0)
- if (locked == 1)
- user << "You turn off the ID lock."
- locked = 0
- return
- else if (locked == 0)
- user << "You turn on the ID lock."
- locked = 1
- return
- else
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, src)
- s.start()
- user << "\red The ID lock is broken!"
- return
+ if(open)
+ if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P))
return
- else
- user << "The ID lock can't be accessed in this state."
- else if (istype(P, /obj/item/weapon/card/emag))
- if (construct_op == 0)
- if (emagged == 0)
- emagged = 1
- locked = 0
- src.req_access = null
- user << "\red You break the ID lock on the [src]."
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, src)
- s.start()
- return
- else
- user << "The ID lock can't be accessed in this state."
- if(locked == 0)
- if(open == 1)
- switch(construct_op)
- if(0)
- if(istype(P, /obj/item/weapon/screwdriver))
- user << "You open the circuit cover."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- icon_state = "borgdecon1"
- construct_op ++
- if(1)
- if(istype(P, /obj/item/weapon/screwdriver))
- user << "You close the circuit cover."
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- icon_state = "borgcharger0"
- construct_op --
- if(istype(P, /obj/item/weapon/wrench))
- user << "You dislodge the internal plating."
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- icon_state = "borgdecon2"
- construct_op ++
- if(2)
- if(istype(P, /obj/item/weapon/wrench))
- user << "You secure the internal plating."
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- icon_state = "borgdecon1"
- construct_op --
- if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- user << "You remove the cables."
- icon_state = "borgdecon3"
- construct_op ++
- var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
- A.amount = 5
- stat |= BROKEN // the machine's been borked!
- if(3)
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/A = P
- if(A.amount >= 5)
- user << "You insert the cables."
- A.amount -= 5
- if(A.amount <= 0)
- user.drop_item()
- qdel(A)
- icon_state = "borgdecon2"
- construct_op --
- stat &= ~BROKEN // the machine's not borked anymore!
- else
- user << "You need more cable"
- if(istype(P, /obj/item/weapon/crowbar))
- user << "You begin prying out the circuit board and components..."
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,60))
- user << "You finish prying out the components."
-
- // Drop all the component stuff
- if(contents.len > 0)
- for(var/obj/x in src)
- x.loc = user.loc
- else
-
- // If the machine wasn't made during runtime, probably doesn't have components:
- // manually find the components and drop them!
- var/newpath = text2path(circuitboard)
- var/obj/item/weapon/circuitboard/C = new newpath
- for(var/I in C.req_components)
- for(var/i = 1, i <= C.req_components[I], i++)
- newpath = text2path(I)
- var/obj/item/s = new newpath
- s.loc = user.loc
- if(istype(P, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/A = P
- A.amount = 1
-
- // Drop a circuit board too
- C.loc = user.loc
-
- // Create a machine frame and delete the current machine
- var/obj/machinery/constructable_frame/machine_frame/F = new
- F.loc = src.loc
- qdel(src)
- else
- user << "This needs to be open first."
- else
- user << "This needs to be unlocked first."
+ if(exchange_parts(user, P))
+ return
+ default_deconstruction_crowbar(P)
/obj/machinery/recharge_station/attack_hand(user as mob)
if(..()) return
@@ -221,19 +109,20 @@
build_icon()
/obj/machinery/recharge_station/close_machine()
- for(var/mob/living/silicon/robot/R in loc)
- R.stop_pulling()
- if(R.client)
- R.client.eye = src
- R.client.perspective = EYE_PERSPECTIVE
- R.loc = src
- occupier = R
- use_power = 2
- add_fingerprint(R)
- break
- open = 0
- density = 1
- build_icon()
+ if(!panel_open)
+ for(var/mob/living/silicon/robot/R in loc)
+ R.stop_pulling()
+ if(R.client)
+ R.client.eye = src
+ R.client.perspective = EYE_PERSPECTIVE
+ R.loc = src
+ occupier = R
+ use_power = 2
+ add_fingerprint(R)
+ break
+ open = 0
+ density = 1
+ build_icon()
/obj/machinery/recharge_station/proc/build_icon()
if(NOPOWER|BROKEN)
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 8161c2c51f1..a74260c1dcd 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -5,7 +5,7 @@
icon_state = "sheater0"
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
var/on = 0
var/open = 0
var/set_temperature = 50 // in celcius, add T0C for kelvin
@@ -49,14 +49,14 @@
..(severity)
attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/cell))
+ if(istype(I, /obj/item/weapon/stock_parts/cell))
if(open)
if(cell)
user << "There is already a power cell inside."
return
else
// insert cell
- var/obj/item/weapon/cell/C = usr.get_active_hand()
+ var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
user.drop_item()
cell = C
@@ -136,7 +136,7 @@
if("cellinstall")
if(open && !cell)
- var/obj/item/weapon/cell/C = usr.get_active_hand()
+ var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
if(istype(C))
usr.drop_item()
cell = C
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 3d886170aa2..e4a334f3398 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -224,6 +224,9 @@
if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W))
return
+ if(exchange_parts(user, W))
+ return
+
default_deconstruction_crowbar(W)
/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T)
@@ -318,6 +321,9 @@
if(default_deconstruction_screwdriver(user, "controller-o", "controller", W))
return
+ if(exchange_parts(user, W))
+ return
+
default_deconstruction_crowbar(W)
if(panel_open)
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index e61c76e5520..a035d061161 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -221,9 +221,9 @@
if(4)
A = new /obj/item/projectile/magic/change( loc )
if(5)
- A = new /obj/item/projectile/bluetag( loc )
+ A = new /obj/item/projectile/lasertag/bluetag( loc )
if(6)
- A = new /obj/item/projectile/redtag( loc )
+ A = new /obj/item/projectile/lasertag/redtag( loc )
A.original = target
use_power(500)
else
@@ -262,12 +262,13 @@
popping = 0
/obj/machinery/turret/bullet_act(var/obj/item/projectile/Proj)
- src.health -= Proj.damage
- ..()
- if(prob(45) && Proj.damage > 0) src.spark_system.start()
- qdel(Proj)
- if (src.health <= 0)
- src.die()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
+ ..()
+ if(prob(45) && Proj.damage > 0) src.spark_system.start()
+ qdel(Proj)
+ if (src.health <= 0)
+ src.die()
return
/obj/machinery/turret/attackby(obj/item/weapon/W, mob/user)//I can't believe no one added this before/N
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 2a82e922b3d..c12111d1d2f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -767,13 +767,12 @@
/obj/item/clothing/suit/wizrobe/marisa/fake = 1,/obj/item/clothing/under/sundress = 1,/obj/item/clothing/head/witchwig = 1,/obj/item/weapon/staff/broom = 1,
/obj/item/clothing/suit/wizrobe/fake = 1,/obj/item/clothing/head/wizard/fake = 1,/obj/item/weapon/staff = 3,/obj/item/clothing/mask/gas/sexyclown = 1,
/obj/item/clothing/under/sexyclown = 1,/obj/item/clothing/mask/gas/sexymime = 1,/obj/item/clothing/under/sexymime = 1,/obj/item/clothing/suit/apron/overalls = 1,
- /obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero, /obj/item/clothing/head/sombrero/green =1, /obj/item/clothing/suit/poncho = 1,
- /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1,) //Pretty much everything that had a chance to spawn.
- contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1,/obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
+ /obj/item/clothing/head/rabbitears =1, /obj/item/clothing/head/sombrero = 1, /obj/item/clothing/head/sombrero/green = 1, /obj/item/clothing/suit/poncho = 1,
+ /obj/item/clothing/suit/poncho/green = 1, /obj/item/clothing/suit/poncho/red = 1) //Pretty much everything that had a chance to spawn.
+ contraband = list(/obj/item/clothing/suit/cardborg = 1,/obj/item/clothing/head/cardborg = 1, /obj/item/clothing/suit/judgerobe = 1,/obj/item/clothing/head/powdered_wig = 1,/obj/item/weapon/gun/magic/wand = 1)
premium = list(/obj/item/clothing/suit/hgpirate = 1, /obj/item/clothing/head/hgpiratecap = 1, /obj/item/clothing/head/helmet/roman = 1, /obj/item/clothing/head/helmet/roman/legionaire = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, /obj/item/weapon/shield/riot/roman = 1)
refill_canister = /obj/item/weapon/vending_refill/autodrobe
-
/obj/machinery/vending/autodrobe/New()
..()
component_parts = list()
@@ -817,8 +816,8 @@
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access_txt = "11" //Engineering Equipment access
- products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10)
- contraband = list(/obj/item/weapon/cell/potato = 3)
+ products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/stock_parts/cell/high = 10)
+ contraband = list(/obj/item/weapon/stock_parts/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
//This one's from bay12
@@ -831,7 +830,7 @@
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
/obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
- /obj/item/weapon/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
+ /obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
/obj/item/weapon/stock_parts/matter_bin = 5,/obj/item/weapon/stock_parts/manipulator = 5,/obj/item/weapon/stock_parts/console_screen = 5)
// There was an incorrect entry (cablecoil/power). I improvised to cablecoil/heavyduty.
@@ -846,7 +845,7 @@
icon_deny = "robotics-deny"
req_access_txt = "29"
products = list(/obj/item/clothing/suit/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash = 4,
- /obj/item/weapon/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
+ /obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
//everything after the power cell had no amounts, I improvised. -Sayu
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 8bc32a61042..97e7ed3f775 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -114,7 +114,7 @@
if(!istype(target, /obj) && !istype(target, /mob)) return
if(istype(target, /mob))
var/mob/M = target
- M.make_dizzy(3)
+ M.Dizzy(3)
M.adjustBruteLoss(1)
M.updatehealth()
for (var/mob/V in viewers(src))
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 5d8f46eff63..4567cb95b9b 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -41,7 +41,7 @@
ME.attach(src)
return
-/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null)
+/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
if(C)
C.forceMove(src)
cell = C
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index e04b0450df1..b1eb2dff542 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -134,7 +134,7 @@
M.Stun(10)
M.Paralyse(4)
else
- M.make_jittery(500)
+ M.Jitter(500)
/* //else the mousetraps are useless
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 008d90c0bf8..b832b41212b 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -23,6 +23,7 @@
var/max_charge = 50
var/on = 0
var/repairability = 0
+ var/turf/recharging_turf = null
/obj/machinery/mech_bay_recharge_port/New()
..()
@@ -35,23 +36,31 @@
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
+ recharging_turf = get_step(loc, dir)
/obj/machinery/mech_bay_recharge_port/RefreshParts()
var/MC
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
MC += C.rating
- max_charge = MC - 4 * 50
+ max_charge = MC * 25
/obj/machinery/mech_bay_recharge_port/process()
if(stat & NOPOWER || !recharge_console)
return
if(!recharging_mech)
- recharging_mech = locate(/obj/mecha) in get_step(loc, dir)
- if(recharging_mech && recharging_mech.cell && (recharging_mech.loc == get_step(loc, dir)))
+ recharging_mech = locate(/obj/mecha) in recharging_turf
+ if(recharging_mech)
+ recharge_console.update_icon()
+ if(recharging_mech && recharging_mech.cell)
if(recharging_mech.cell.charge < recharging_mech.cell.maxcharge)
var/delta = min(max_charge, recharging_mech.cell.maxcharge - recharging_mech.cell.charge)
recharging_mech.give_power(delta)
use_power(delta*150)
+ else
+ recharge_console.update_icon()
+ if(recharging_mech.loc != recharging_turf)
+ recharging_mech = null
+ recharge_console.update_icon()
/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user)
@@ -59,19 +68,14 @@
return
if(default_change_direction_wrench(user, I))
+ recharging_turf = get_step(loc, dir)
+ return
+
+ if(exchange_parts(user, I))
return
default_deconstruction_crowbar(I)
- if(panel_open)
- if(istype(I, /obj/item/device/multitool))
- var/obj/item/device/multitool/MT = I
- if(istype(MT.buffer, /obj/machinery/computer/mech_bay_power_console))
- recharge_console = MT.buffer
- MT.buffer = 0
- recharge_console.recharge_port = src
- user << "span class='notice'>You upload the data from the buffer to [src.name]."
-
/obj/machinery/computer/mech_bay_power_console
name = "mech bay power control console"
density = 1
@@ -81,44 +85,66 @@
circuit = /obj/item/weapon/circuitboard/mech_bay_power_console
var/obj/machinery/mech_bay_recharge_port/recharge_port
-/obj/machinery/computer/mech_bay_power_console/attackby(obj/item/I, mob/user)
- ..()
- if(istype(I, /obj/item/device/multitool))
- var/obj/item/device/multitool/MT = I
- MT.buffer = src
- user << "You download data to the buffer."
-
-
/obj/machinery/computer/mech_bay_power_console/attack_ai(mob/user)
return interact(user)
/obj/machinery/computer/mech_bay_power_console/attack_hand(mob/user)
- if(!(..()))
- return interact(user)
+ if(..())
+ return
+ interact(user)
-/obj/machinery/computer/mech_bay_power_console/interact(mob/user as mob)
+/obj/machinery/computer/mech_bay_power_console/interact(mob/user)
var/data
if(!recharge_port)
- data += "No recharging port detected.
"
+ data += "No recharging port detected.
"
+ data += "Reconnect"
else
data += "Mech status
"
if(!recharge_port.recharging_mech)
data += "No mech detected.
"
else
data += "Integrity: [recharge_port.recharging_mech.health]
"
- data += "Power: [recharge_port.recharging_mech.cell]
"
+ data += "Power: [recharge_port.recharging_mech.cell.charge]/[recharge_port.recharging_mech.cell.maxcharge]"
var/datum/browser/popup = new(user, "mech recharger", name, 300, 300)
popup.set_content(data)
popup.open()
return
-/obj/machinery/computer/mech_bay_power_console/process()
+/obj/machinery/computer/mech_bay_power_console/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["reconnect"])
+ reconnect()
updateUsrDialog()
- update_icon()
+
+/obj/machinery/computer/mech_bay_power_console/proc/reconnect()
+ if(recharge_port)
+ return
+ recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in range(1)
+ if(!recharge_port )
+ for(var/D in cardinal)
+ var/turf/A = get_step(src, D)
+ A = get_step(A, D)
+ recharge_port = locate(/obj/machinery/mech_bay_recharge_port) in A
+ if(recharge_port)
+ break
+ if(recharge_port)
+ if(!recharge_port.recharge_console)
+ recharge_port.recharge_console = src
+ else
+ recharge_port = null
+
+/obj/machinery/computer/mech_bay_power_console/process()
+ if(recharge_port && recharge_port.recharging_mech && recharge_port.recharging_mech.cell)
+ updateDialog()
+
/obj/machinery/computer/mech_bay_power_console/update_icon()
if(!recharge_port || !recharge_port.recharging_mech || !recharge_port.recharging_mech.cell || !(recharge_port.recharging_mech.cell.charge < recharge_port.recharging_mech.cell.maxcharge))
icon_state = "recharge_comp"
else
- icon_state = "recharge_comp_on"
\ No newline at end of file
+ icon_state = "recharge_comp_on"
+
+/obj/machinery/computer/mech_bay_power_console/initialize()
+ reconnect()
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index a8e2d57dafa..0c37bff25b0 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -708,6 +708,9 @@
if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W))
return
+ if(exchange_parts(user, W))
+ return
+
default_deconstruction_crowbar(W)
if (panel_open)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 3ee7b1d9575..7d121713b16 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -27,7 +27,7 @@
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
//the values in this list show how much damage will pass through, not how much will be absorbed.
var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
var/state = 0
var/list/log = new
var/last_message = 0
@@ -108,7 +108,7 @@
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
return internal_tank
-/obj/mecha/proc/add_cell(var/obj/item/weapon/cell/C=null)
+/obj/mecha/proc/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
if(C)
C.forceMove(src)
cell = C
@@ -512,8 +512,9 @@
return
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
- src.take_damage(Proj.damage,Proj.flag)
- src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.take_damage(Proj.damage,Proj.flag)
+ src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
Proj.on_hit(src)
return
@@ -726,13 +727,15 @@
user << "You screw the cell in place"
return
- else if(istype(W, /obj/item/weapon/cell))
+ else if(istype(W, /obj/item/weapon/stock_parts/cell))
if(state==4)
if(!src.cell)
+ var/obj/item/weapon/stock_parts/cell/C = W
user << "You install the powercell"
user.drop_item()
- W.forceMove(src)
- src.cell = W
+ C.forceMove(src)
+ C.use(C.charge * 0.8)
+ src.cell = C
src.log_message("Powercell installed")
else
user << "There's already a powercell installed."
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 223e28d7437..56a57d8a849 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -13,6 +13,8 @@
var/times_used = 0 //Number of times it's been used.
var/broken = 0 //Is the flash burnt out?
var/last_used = 0 //last world.time it was used.
+ var/burnt = "flashburnt"
+ var/flashanim = "flash2"
/obj/item/device/flash/proc/clown_check(mob/user)
if(user && (CLUMSY in user.mutations) && prob(50))
@@ -33,7 +35,7 @@
/obj/item/device/flash/proc/burn_out(mob/user = null) //Made so you can override it if you want to have an invincible flash from R&D or something.
broken = 1
- icon_state = "flashburnt"
+ icon_state = burnt
if(user)
user << "The bulb has burnt out!"
@@ -112,7 +114,7 @@
qdel(animation)
if(!flashfail)
- flick("flash2", src)
+ flick(flashanim, src)
if(!issilicon(M))
user.visible_message("[user] blinds [M] with the flash!")
@@ -201,4 +203,12 @@
/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
..()
if(!broken)
- burn_out(user)
\ No newline at end of file
+ burn_out(user)
+
+/obj/item/device/flash/memorizer
+ name = "memorizer"
+ desc = "If you see this, you're not likely to remember it any time soon."
+ icon_state = "memorizer"
+ item_state = "nullrod"
+ burnt = "memorizerburnt"
+ flashanim = "memorizer2"
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index dd9476d3bb0..fe774ccf435 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -102,7 +102,7 @@ MASS SPECTROMETER
var/tox_loss = M.getToxLoss()
var/fire_loss = M.getFireLoss()
var/brute_loss = M.getBruteLoss()
- var/mob_status = (M.stat > 1 ? "Deceased" : text("[]% healthy", M.health - M.halloss))
+ var/mob_status = (M.stat > 1 ? "Deceased" : text("[]% healthy", M.health))
if(M.status_flags & FAKEDEATH)
mob_status = "Deceased"
@@ -133,6 +133,9 @@ MASS SPECTROMETER
user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", brute_loss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1)
+ if(M.getStaminaLoss())
+ user.show_message(text("Subject appears to be suffering from fatigue."), 1)
+
if (M.getCloneLoss())
user.show_message(text("Subject appears to have been imperfectly cloned."), 1)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 949ab9cba0a..83229a81125 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -43,7 +43,7 @@
construction_time = 350
construction_cost = list("metal"=40000)
var/wires = 0.0
- var/obj/item/weapon/cell/cell = null
+ var/obj/item/weapon/stock_parts/cell/cell = null
/obj/item/robot_parts/head
name = "cyborg head"
@@ -230,7 +230,7 @@
/obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob)
..()
- if(istype(W, /obj/item/weapon/cell))
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
if(src.cell)
user << "\blue You have already inserted a cell!"
return
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index a69d51fb969..ff92bf3ab64 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -7,95 +7,73 @@
/obj/item/weapon/grenade/flashbang/prime()
update_mob()
- for(var/obj/structure/closet/L in view(get_turf(src), null))
- if(locate(/mob/living/carbon/, L))
- for(var/mob/living/carbon/M in L)
- bang(get_turf(src), M)
+ var/flashbang_turf = get_turf(src)
+ for(var/obj/structure/closet/L in view(7, flashbang_turf))
+ for(var/mob/living/M in L)
+ bang(get_turf(M), M)
+ for(var/mob/living/M in view(7, flashbang_turf))
+ bang(get_turf(M), M)
- for(var/mob/living/carbon/M in viewers(get_turf(src), null))
- bang(get_turf(src), M)
-
- for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here
+ for(var/obj/effect/blob/B in view(8,flashbang_turf)) //Blob damage here
var/damage = round(30/(get_dist(B,get_turf(src))+1))
B.health -= damage
B.update_icon()
qdel(src)
-/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M)
- // Added a new proc called 'bang' that takes a location and a person to be banged.
- // Called during the loop that bangs people in lockers/containers and when banging
- // people in normal view. Could theroetically be called during other explosions.
- // -- Polymorph
- M << "\red BANG"
+/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/M)
+ M << "BANG"
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
//Checking for protections
var/eye_safety = 0
- var/ear_safety = 0
+ var/ear_safety = 2
+ var/distance = max(1, get_dist(src, T))
+ var/takes_eye_damage = 0
if(iscarbon(M))
- eye_safety = M.eyecheck()
- if(ishuman(M))
- if(istype(M:ears, /obj/item/clothing/ears/earmuffs))
- ear_safety += 2
- if(HULK in M.mutations)
- ear_safety += 1
- if(istype(M:head, /obj/item/clothing/head/helmet))
- ear_safety += 1
+ var/mob/living/carbon/C = M
+ eye_safety = C.eyecheck()
+ if(ishuman(C))
+ takes_eye_damage = 1
+ var/mob/living/carbon/human/H = C
+ ear_safety = 0
+ if(istype(H.ears, /obj/item/clothing/ears/earmuffs) || istype(H.head, /obj/item/clothing/head/helmet))
+ ear_safety++
+ if(ismonkey(C))
+ ear_safety = 0
+ takes_eye_damage = 1
-//Flashing everyone
+//Flash
if(eye_safety < 1)
flick("e_flash", M.flash)
M.eye_stat += rand(1, 3)
- M.Stun(2)
- M.Weaken(5)
-
-
-
-//Now applying sound
- if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M))
- if(ear_safety > 0)
- M.Stun(2)
- M.Weaken(1)
+ M.Stun(max(10/distance, 3))
+ M.Weaken(max(10/distance, 3))
+ if (M.eye_stat >= 20 && takes_eye_damage)
+ M << "Your eyes start to burn badly!"
+ M.disabilities |= NEARSIGHTED
+ if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
+ if (prob(M.eye_stat - 20 + 1))
+ M << "You can't see anything!"
+ M.sdisabilities |= BLIND
+//Bang
+ if((src.loc == M) || src.loc == M.loc)//Holding on person or being exactly where lies is significantly more dangerous and voids protection
+ M.Stun(10)
+ M.Weaken(10)
+ if(!ear_safety)
+ M.Stun(max(10/distance, 3))
+ M.Weaken(max(10/distance, 3))
+ M.ear_damage += rand(0, 5)
+ M.ear_deaf = max(M.ear_deaf,15)
+ if (M.ear_damage >= 15)
+ M << "Your ears start to ring badly!"
+ if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
+ if (prob(M.ear_damage - 10 + 5))
+ M << "You can't hear anything!"
+ M.sdisabilities |= DEAF
else
- M.Stun(5)
- M.Weaken(3)
- if ((prob(14) || (M == src.loc && prob(70))))
- M.ear_damage += rand(1, 10)
- else
- M.ear_damage += rand(0, 5)
- M.ear_deaf = max(M.ear_deaf,15)
-
- else if(get_dist(M, T) <= 5)
- if(!ear_safety)
- M.Stun(8)
- M.ear_damage += rand(0, 3)
- M.ear_deaf = max(M.ear_deaf,10)
-
- else if(!ear_safety)
- M.Stun(4)
- M.ear_damage += rand(0, 1)
- M.ear_deaf = max(M.ear_deaf,5)
-
-//This really should be in mob not every check
- if (M.eye_stat >= 20)
- M << "\red Your eyes start to burn badly!"
- M.disabilities |= NEARSIGHTED
- if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
- if (prob(M.eye_stat - 20 + 1))
- M << "\red You can't see anything!"
- M.sdisabilities |= BLIND
- if (M.ear_damage >= 15)
- M << "\red Your ears start to ring badly!"
- if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
- if (prob(M.ear_damage - 10 + 5))
- M << "\red You can't hear anything!"
- M.sdisabilities |= DEAF
- else
- if (M.ear_damage >= 5)
- M << "\red Your ears start to ring!"
- M.update_icons()
-
+ if (M.ear_damage >= 5)
+ M << "Your ears start to ring!"
/obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve
desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index a5f595ca94e..799b5e57d52 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -40,7 +40,7 @@
var/turf/user_loc = user.loc
var/turf/C_loc = C.loc
- if(do_after(user, 40))
+ if(do_after(user, 30))
if(!C || C.handcuffed)
return
if(user_loc == user.loc && C_loc == C.loc)
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 325e53cce16..394c736c3cc 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -14,7 +14,7 @@
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
- hidden_uplink.uplink_owner="[source]"
+ hidden_uplink.uplink_owner="[source.key]"
return 1
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 3cf9465d1f1..6683467952a 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -138,7 +138,7 @@
/obj/item/weapon/melee/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R)
if(R.cell)
- var/obj/item/weapon/cell/C = R.cell
+ var/obj/item/weapon/stock_parts/cell/C = R.cell
if(active && !(C.use(hitcost)))
attack_self(R)
R << "It's out of charge!"
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index b7d70796868..1d2e273aaee 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -1,4 +1,4 @@
-/obj/item/weapon/cell
+/obj/item/weapon/stock_parts/cell
name = "power cell"
desc = "A rechargable electrochemical power cell."
icon = 'icons/obj/power.dmi'
@@ -23,72 +23,78 @@
viewers(user) << "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide."
return (FIRELOSS)
-/obj/item/weapon/cell/crap
+/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
origin_tech = "powerstorage=0"
maxcharge = 500
g_amt = 40
+ rating = 2
-/obj/item/weapon/cell/crap/empty/New()
+/obj/item/weapon/stock_parts/cell/crap/empty/New()
..()
charge = 0
-/obj/item/weapon/cell/secborg
+/obj/item/weapon/stock_parts/cell/secborg
name = "security borg rechargable D battery"
origin_tech = "powerstorage=0"
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
g_amt = 40
+ rating = 2.5
-/obj/item/weapon/cell/secborg/empty/New()
+/obj/item/weapon/stock_parts/cell/secborg/empty/New()
..()
charge = 0
-/obj/item/weapon/cell/high
+/obj/item/weapon/stock_parts/cell/high
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
icon_state = "hcell"
maxcharge = 10000
g_amt = 60
+ rating = 3
-/obj/item/weapon/cell/high/empty/New()
+/obj/item/weapon/stock_parts/cell/high/empty/New()
..()
charge = 0
-/obj/item/weapon/cell/super
+/obj/item/weapon/stock_parts/cell/super
name = "super-capacity power cell"
origin_tech = "powerstorage=5"
icon_state = "scell"
maxcharge = 20000
g_amt = 70
construction_cost = list("metal"=750,"glass"=100)
+ rating = 4
-/obj/item/weapon/cell/super/empty/New()
+/obj/item/weapon/stock_parts/cell/super/empty/New()
..()
charge = 0
-/obj/item/weapon/cell/hyper
+/obj/item/weapon/stock_parts/cell/hyper
name = "hyper-capacity power cell"
origin_tech = "powerstorage=6"
icon_state = "hpcell"
maxcharge = 30000
g_amt = 80
construction_cost = list("metal"=500,"glass"=150,"gold"=200,"silver"=200)
+ rating = 5
-/obj/item/weapon/cell/hyper/empty/New()
+/obj/item/weapon/stock_parts/cell/hyper/empty/New()
..()
charge = 0
-/obj/item/weapon/cell/infinite
+/obj/item/weapon/stock_parts/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
origin_tech = null
maxcharge = 30000
g_amt = 80
+ rating = 6
use()
return 1
-/obj/item/weapon/cell/potato
+/obj/item/weapon/stock_parts/cell/potato
name = "potato battery"
desc = "A rechargable starch based power cell."
origin_tech = "powerstorage=1"
@@ -99,9 +105,9 @@
m_amt = 0
g_amt = 0
minor_fault = 1
+ rating = 1
-
-/obj/item/weapon/cell/slime
+/obj/item/weapon/stock_parts/cell/slime
name = "charged slime core"
desc = "A yellow slime core infused with plasma, it crackles with power."
origin_tech = "powerstorage=2;biotech=4"
@@ -109,4 +115,5 @@
icon_state = "yellow slime extract" //"potato_battery"
maxcharge = 10000
m_amt = 0
- g_amt = 0
\ No newline at end of file
+ g_amt = 0
+ rating = 3
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 26d7c5ec5cb..ef7cc49d1b1 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -11,7 +11,7 @@
attack_verb = list("beaten")
var/stunforce = 5
var/status = 0
- var/obj/item/weapon/cell/high/bcell = null
+ var/obj/item/weapon/stock_parts/cell/high/bcell = null
var/hitcost = 1000
suicide_act(mob/user)
@@ -24,7 +24,7 @@
return
/obj/item/weapon/melee/baton/CheckParts()
- bcell = locate(/obj/item/weapon/cell) in contents
+ bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
/obj/item/weapon/melee/baton/loaded/New() //this one starts with a cell pre-installed.
@@ -59,7 +59,7 @@
usr <<"The baton does not have a power source installed."
/obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user)
- if(istype(W, /obj/item/weapon/cell))
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
if(!bcell)
user.drop_item()
W.loc = src
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 8e572d89de0..4e64b78611c 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/vending_refill/New(amt = -1)
..()
name = "\improper [machine_name] restocking unit"
- if(amt > -1)
+ if(isnum(amt) && amt > -1)
charges = amt
/obj/item/weapon/vending_refill/examine()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index eac99581760..717a2282dce 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -140,13 +140,13 @@
qdel(src)
/obj/structure/closet/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
..()
- if(health <= 0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- qdel(src)
-
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
+ if(health <= 0)
+ for(var/atom/movable/A as mob|obj in src)
+ A.loc = src.loc
+ qdel(src)
return
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 2224652f68b..14b152cdca5 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -99,5 +99,7 @@
new /obj/item/clothing/suit/lawyer/bluejacket(src)
new /obj/item/clothing/under/lawyer/purpsuit(src)
new /obj/item/clothing/suit/lawyer/purpjacket(src)
- new /obj/item/clothing/shoes/brown(src)
- new /obj/item/clothing/shoes/black(src)
\ No newline at end of file
+ new /obj/item/clothing/under/lawyer/blacksuit(src)
+ new /obj/item/clothing/suit/lawyer/blackjacket(src)
+ new /obj/item/clothing/shoes/laceup(src)
+ new /obj/item/clothing/shoes/laceup(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
index 7cfb4f18e2f..3bf64ba34d8 100644
--- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm
+++ b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
@@ -13,5 +13,5 @@
new /obj/item/clothing/head/helmet/space/nasavoid(src)
new /obj/item/clothing/suit/space/nasavoid(src)
new /obj/item/weapon/crowbar(src)
- new /obj/item/weapon/cell(src)
+ new /obj/item/weapon/stock_parts/cell(src)
new /obj/item/device/multitool(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index ba8d90e318c..5191632a60f 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -25,6 +25,8 @@
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/clothing/gloves/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/clothing/under/captainformal(src)
+ new /obj/item/clothing/head/helmet/HoS/dermal(src)
return
@@ -91,6 +93,8 @@
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/storage/belt/security(src)
+ new /obj/item/clothing/under/hosformalfem(src)
+ new /obj/item/clothing/under/hosformalmale(src)
return
@@ -154,13 +158,19 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
return
+/obj/structure/closet/secure_closet/security/sec
+
+ New()
+ new /obj/item/weapon/melee/baton/loaded(src)
+ ..()
+ return
+
/obj/structure/closet/secure_closet/security/cargo
New()
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index f4b31fd97fc..2523b093360 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -19,7 +19,7 @@
new /obj/item/clothing/suit/space/rig/syndi(src)
new /obj/item/weapon/storage/belt/military(src)
new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/cell/high(src)
+ new /obj/item/weapon/stock_parts/cell/high(src)
new /obj/item/device/multitool(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 8b26ac4ced2..b355ad88802 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -301,6 +301,10 @@
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
new /obj/item/clothing/head/soft/grey(src)
+ if(prob(40))
+ new /obj/item/clothing/under/assistantformal(src)
+ if(prob(40))
+ new /obj/item/clothing/under/assistantformal(src)
return
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 4f1e65f02e5..74f79c2a49c 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -29,7 +29,8 @@
/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
src.healthcheck()
return
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 9e892238681..cb41a309e97 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -92,10 +92,12 @@
return !density
/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj) return
+ if(!Proj)
+ return
..()
- src.health -= Proj.damage*0.2
- healthcheck()
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage*0.2
+ healthcheck()
return
/obj/structure/grille/attackby(obj/item/weapon/W as obj, mob/user as mob)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 97e471eabb8..05f8d37872a 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -48,10 +48,11 @@
/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj)
if(prob(Proj.damage * 2))
- if(!shattered)
- shatter()
- else
- playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ if(!shattered)
+ shatter()
+ else
+ playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index f20e07703eb..7689b466c80 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -36,9 +36,9 @@
reqs = list(/obj/item/weapon/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/weapon/wirecutters = 1,
- /obj/item/weapon/cell = 1)
+ /obj/item/weapon/stock_parts/cell = 1)
time = 80
- parts = list(/obj/item/weapon/cell = 1)
+ parts = list(/obj/item/weapon/stock_parts/cell = 1)
/datum/table_recipe/ed209
name = "ED209"
@@ -51,7 +51,7 @@
/obj/item/stack/sheet/metal = 5,
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/gun/energy/taser = 1,
- /obj/item/weapon/cell = 1,
+ /obj/item/weapon/stock_parts/cell = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 9b511b88559..f4e1f28739b 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -16,7 +16,8 @@
/obj/structure/window/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ health -= Proj.damage
..()
if(health <= 0)
new /obj/item/weapon/shard(loc)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8ac93b79d22..eca53feaaf3 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -19,7 +19,7 @@
/* 21st Sept 2010
Updated by Skie -- Still not perfect but better!
Stuff you can't do:
-Call proc /mob/proc/make_dizzy() for some player
+Call proc /mob/proc/Dizzy() for some player
Because if you select a player mob as owner it tries to do the proc for
/mob/living/carbon/human/ instead. And that gives a run-time error.
But you can call procs that are of type /mob/living/carbon/human/proc/ for that player.
@@ -709,7 +709,7 @@ var/global/list/g_fancy_list_of_safe_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/ammo_box/c10mm(M), slot_l_store)
if ("tournament chef") //Steven Seagal FTW
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 20864c641ee..9c8d10a3921 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -118,6 +118,16 @@ obj/machinery/gateway/centerstation/process()
if(!ready) return
if(!active) return
if(!awaygate) return
+
+ if(istype(M, /obj/item/weapon/disk/nuclear))
+ return
+
+ if(M.GetTypeInAllContents(/obj/item/weapon/disk/nuclear))
+ if(ismob(M))
+ var/mob/MOB = M
+ MOB << "You are forbidden from taking the nuclear authentication disk off station."
+ return
+
if(awaygate.calibrated)
M.loc = get_step(awaygate.loc, SOUTH)
M.dir = SOUTH
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index a3a679e4472..dc47b5e80c6 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -96,4 +96,12 @@
src.chained = 1
src.slowdown = 15
src.icon_state = "orange1"
- return
\ No newline at end of file
+ return
+
+/obj/item/clothing/shoes/orange/attack_hand(mob/user)
+ if(ishuman(user))
+ var/mob/living/carbon/human/C = user
+ if(C.shoes == src && src.chained == 1)
+ user << "You need help taking these off!"
+ return
+ ..()
diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm
index 53ccf949f5f..407d5f93776 100644
--- a/code/modules/clothing/spacesuits/ninja.dm
+++ b/code/modules/clothing/spacesuits/ninja.dm
@@ -3,7 +3,7 @@
name = "ninja hood"
icon_state = "s-ninja"
item_state = "s-ninja_mask"
- allowed = list(/obj/item/weapon/cell)
+ allowed = list(/obj/item/weapon/stock_parts/cell)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
@@ -12,13 +12,13 @@
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
icon_state = "s-ninja"
item_state = "s-ninja_suit"
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/cell)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/stock_parts/cell)
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
//Important parts of the suit.
var/mob/living/carbon/affecting = null//The wearer.
- var/obj/item/weapon/cell/cell//Starts out with a high-capacity cell using New().
+ var/obj/item/weapon/stock_parts/cell/cell//Starts out with a high-capacity cell using New().
var/datum/effect/effect/system/spark_spread/spark_system//To create sparks.
var/reagent_list[] = list("tricordrazine","dexalinp","spaceacillin","anti_toxin","nutriment","radium","hyronalin")//The reagents ids which are added to the suit at New().
var/stored_research[]//For stealing station research.
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 924c0e21997..bb12a94f227 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -100,6 +100,14 @@
blood_overlay_type = "coat"
body_parts_covered = CHEST|ARMS
+/obj/item/clothing/suit/lawyer/blackjacket
+ name = "black suit jacket"
+ desc = "A professional suit jacket."
+ icon_state = "suitjacket_black"
+ item_state = "ro_suit"
+ blood_overlay_type = "coat"
+ body_parts_covered = CHEST|ARMS
+
//Mime
/obj/item/clothing/suit/suspenders
name = "suspenders"
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 6eef367f8cb..e7c7aeb259a 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -2,7 +2,9 @@
name = "wizard hat"
desc = "Strange-looking hat-wear that most certainly belongs to a real magic user."
icon_state = "wizard"
- //Not given any special protective value since the magic robes are full-body protection --NEO
+ gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE
+ permeability_coefficient = 0.01
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20)
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
@@ -13,6 +15,9 @@
name = "wizard hat"
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
icon_state = "wizard-fake"
+ gas_transfer_coefficient = 1
+ permeability_coefficient = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/wizard/marisa
name = "witch hat"
@@ -31,10 +36,10 @@
desc = "A magnificant, gem-lined robe that seems to radiate power."
icon_state = "wizard"
item_state = "wizrobe"
- gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE
+ gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- body_parts_covered = CHEST|GROIN|ARMS|LEGS //It's magic, I ain't gotta explain shit. --NEO //fuck you neo, no way it covers his head -Pete
- armor = list(melee = 30, bullet = 20, laser = 20,energy = 20, bomb = 20, bio = 20, rad = 20)
+ body_parts_covered = CHEST|GROIN|ARMS|LEGS
+ armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20)
allowed = list(/obj/item/weapon/teleportation_scroll)
flags_inv = HIDEJUMPSUIT
@@ -70,18 +75,23 @@
desc = "A rather dull, blue robe meant to mimick real wizard robes."
icon_state = "wizard-fake"
item_state = "wizrobe"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ gas_transfer_coefficient = 1
+ permeability_coefficient = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/wizard/marisa/fake
name = "witch hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ gas_transfer_coefficient = 1
+ permeability_coefficient = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "witch robe"
desc = "Magic is all about the spell power, ZE!"
icon_state = "marisa"
item_state = "marisarobe"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
-
+ gas_transfer_coefficient = 1
+ permeability_coefficient = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 1b150e281ff..897fa1f2604 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -111,7 +111,7 @@
/obj/item/clothing/under/lawyer/bluesuit
- name = "Blue Suit"
+ name = "blue suit"
desc = "A classy suit and tie"
icon_state = "bluesuit"
item_state = "bluesuit"
@@ -119,12 +119,19 @@
/obj/item/clothing/under/lawyer/purpsuit
- name = "Purple Suit"
+ name = "purple suit"
icon_state = "lawyer_purp"
item_state = "lawyer_purp"
item_color = "lawyer_purp"
fitted = 0
+/obj/item/clothing/under/lawyer/blacksuit
+ name = "black suit"
+ desc = "A professional black suit. Nanotrasen Investigation Bureau approved!"
+ icon_state = "blacksuit"
+ item_state = "ba_suit"
+ item_color = "blacksuit"
+
/obj/item/clothing/under/librarian
name = "sensible suit"
desc = "It's very... sensible."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 642d7585a75..badfb26b91b 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -174,6 +174,41 @@
item_state = "r_suit"
item_color = "red_suit"
+/obj/item/clothing/under/suit_jacket/charcoal
+ name = "charcoal suit"
+ desc = "A charcoal suit and red tie. Very professional."
+ icon_state = "charcoal_suit"
+ item_state = "charcoal_suit"
+ item_color = "charcoal_suit"
+
+/obj/item/clothing/under/suit_jacket/navy
+ name = "navy suit"
+ desc = "A navy suit and red tie, intended for the station's finest."
+ icon_state = "navy_suit"
+ item_state = "navy_suit"
+ item_color = "navy_suit"
+
+/obj/item/clothing/under/suit_jacket/burgundy
+ name = "burgundy suit"
+ desc = "A burgundy suit and black tie. Somewhat formal."
+ icon_state = "burgundy_suit"
+ item_state = "burgundy_suit"
+ item_color = "burgundy_suit"
+
+/obj/item/clothing/under/suit_jacket/checkered
+ name = "checkered suit"
+ desc = "That's a very nice suit you have there. Shame if something were to happen to it, eh?"
+ icon_state = "checkered_suit"
+ item_state = "checkered_suit"
+ item_color = "checkered_suit"
+
+/obj/item/clothing/under/suit_jacket/tan
+ name = "tan suit"
+ desc = "A tan suit with a yellow tie. Smart, but casual."
+ icon_state = "tan_suit"
+ item_state = "tan_suit"
+ item_color = "tan_suit"
+
/obj/item/clothing/under/blackskirt
name = "black skirt"
desc = "A black skirt, very fancy!"
@@ -253,4 +288,41 @@
item_state = "sundress"
item_color = "sundress"
body_parts_covered = CHEST|GROIN
+ fitted = 0
+
+/obj/item/clothing/under/captainformal
+ name = "captain's formal uniform"
+ desc = "A captain's formal-wear, for special occasions."
+ icon_state = "captain_formal"
+ item_state = "by_suit"
+ item_color = "captain_formal"
+
+/obj/item/clothing/under/hosformalmale
+ name = "head of security's formal uniform"
+ desc = "A male head of security's formal-wear, for special occasions."
+ icon_state = "hos_formal_male"
+ item_state = "r_suit"
+ item_color = "hos_formal_male"
+
+/obj/item/clothing/under/hosformalfem
+ name = "head of security's formal uniform"
+ desc = "A female head of security's formal-wear, for special occasions."
+ icon_state = "hos_formal_fem"
+ item_state = "r_suit"
+ item_color = "hos_formal_fem"
+ fitted = 0
+
+/obj/item/clothing/under/assistantformal
+ name = "assistant's formal uniform"
+ desc = "An assistant's formal-wear. Why an assistant needs formal-wear is still unknown."
+ icon_state = "assistant_formal"
+ item_state = "gy_suit"
+ item_color = "assistant_formal"
+
+/obj/item/clothing/under/blacktango
+ name = "black tango dress"
+ desc = "Filled with latin fire."
+ icon_state = "black_tango"
+ item_state = "wcoat"
+ item_color = "black_tango"
fitted = 0
\ No newline at end of file
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 326f09c0c47..b1f1c924178 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -18,6 +18,11 @@
icon_state = "redtie"
item_color = "redtie"
+/obj/item/clothing/tie/black
+ name = "black tie"
+ icon_state = "blacktie"
+ item_color = "blacktie"
+
/obj/item/clothing/tie/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm
index 2cf66afd290..89c02dce671 100644
--- a/code/modules/events/ninja.dm
+++ b/code/modules/events/ninja.dm
@@ -1373,7 +1373,7 @@ ________________________________________________________________________________
reagents.my_atom = src
for(var/reagent_id in reagent_list)
reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting.
- cell = new/obj/item/weapon/cell/high//The suit should *always* have a battery because so many things rely on it.
+ cell = new/obj/item/weapon/stock_parts/cell/high//The suit should *always* have a battery because so many things rely on it.
cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging.
/obj/item/clothing/suit/space/space_ninja/Destroy()
@@ -2158,14 +2158,14 @@ ________________________________________________________________________________
U << "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units."//Let the player know how much total volume was added.
return
- else if(istype(I, /obj/item/weapon/cell))
+ else if(istype(I, /obj/item/weapon/stock_parts/cell))
if(I:maxcharge>cell.maxcharge&&n_gloves&&n_gloves.candrain)
U << "\blue Higher maximum capacity detected.\nUpgrading..."
if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay))
U.drop_item()
I.loc = src
I:charge = min(I:charge+cell.charge, I:maxcharge)
- var/obj/item/weapon/cell/old_cell = cell
+ var/obj/item/weapon/stock_parts/cell/old_cell = cell
old_cell.charge = 0
U.put_in_hands(old_cell)
old_cell.add_fingerprint(U)
@@ -2337,7 +2337,7 @@ ________________________________________________________________________________
U << "\red This SMES cell has run dry of power. You must find another source."
if("CELL")
- var/obj/item/weapon/cell/A = target
+ var/obj/item/weapon/stock_parts/cell/A = target
if(A.charge)
if (G.candrain&&do_after(U,30))
U << "\blue Gained [A.charge] energy from the cell."
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 10fd3b5ba5e..01ebe4fb2e2 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -301,7 +301,7 @@ proc/check_panel(mob/M)
if(weapon_name)
my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
my_target.show_message("[my_target] has been attacked with [weapon_name] by [src.name]!", 1)
- my_target.halloss += 8
+ my_target.staminaloss += 30
if(prob(20)) my_target.eye_blurry += 3
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
@@ -309,7 +309,7 @@ proc/check_panel(mob/M)
else
my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))
my_target.show_message("\red [src.name] has punched [my_target]!", 1)
- my_target.halloss += 4
+ my_target.staminaloss += 30
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index e200a935150..ea7803aecf1 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -100,6 +100,9 @@
B.loc = loc
beaker = null
+ if(exchange_parts(user, O))
+ return
+
default_deconstruction_crowbar(O)
update_icon()
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 2ea0f41f0c3..6c2a883840c 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -158,7 +158,7 @@
W:amount -= 5
if(!W:amount) qdel(W)
user << "You add some cable to the potato and slide it inside the battery encasing."
- var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(user.loc)
+ var/obj/item/weapon/stock_parts/cell/potato/pocell = new /obj/item/weapon/stock_parts/cell/potato(user.loc)
pocell.maxcharge = src.potency * 10
pocell.charge = pocell.maxcharge
qdel(src)
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index c660de9c68f..cde9b447a88 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -47,6 +47,16 @@
waterlevel = maxwater
nutrilevel = 3
+/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/user)
+ if(exchange_parts(user, I))
+ return
+
+ if(istype(I, /obj/item/weapon/crowbar))
+ if(anchored==2)
+ user << "Unscrew the hoses first!"
+ return
+ default_deconstruction_crowbar(I, 1)
+ ..()
/obj/machinery/hydroponics/proc/FindConnected()
@@ -687,7 +697,7 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
anchored = 0
user << "You unwrench [src]."
- else if(istype(O, /obj/item/weapon/screwdriver))
+ else if(istype(O, /obj/item/weapon/screwdriver) && unwrenchable) //THIS NEED TO BE DONE DIFFERENTLY, SOMEONE REFACTOR THE TRAY CODE ALREADY
if(anchored)
if(anchored==2)
@@ -706,17 +716,6 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
return
-obj/machinery/hydroponics/constructable/attackby(var/obj/item/O as obj, var/mob/user as mob)
- ..()
- if(istype(O, /obj/item/weapon/crowbar))
- if(anchored==2)
- user << "Unscrew the hoses first!"
- return
-
- if(istype(src, /obj/machinery/hydroponics/soil))
- return
- default_deconstruction_crowbar(O, 1)
-
/obj/machinery/hydroponics/attack_hand(mob/user as mob)
if(istype(user, /mob/living/silicon)) //How does AI know what plant is?
return
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 7b6c2c5972a..df93376c4f3 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -50,14 +50,136 @@
icon_state = "sextractor"
density = 1
anchored = 1
+ var/piles = list()
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(isrobot(user))
return
+
+ if (istype(O,/obj/item/weapon/storage/bag/plants))
+ var/obj/item/weapon/storage/P = O
+ var/loaded = 0
+ for(var/obj/item/seeds/G in P.contents)
+ if(contents.len >= 999)
+ break
+ ++loaded
+ add(G)
+ if (loaded)
+ user << "You put the seeds from \the [O.name] into [src]."
+ else
+ user << "There are no seeds in \the [O.name]."
+ return
+
user.drop_item()
if(O && O.loc)
O.loc = src.loc
+
if(seedify(O,-1))
user << "You extract some seeds."
+ return
+ else if (istype(O,/obj/item/seeds))
+ add(O)
+ user << "You add [O] to [src.name]."
+ updateUsrDialog()
+ return
else
- user << "You can't extract any seeds from \the [O.name]."
\ No newline at end of file
+ user << "You can't extract any seeds from \the [O.name]."
+
+datum/seed_pile
+ var/name = ""
+ var/lifespan = 0 //Saved stats
+ var/endurance = 0
+ var/maturation = 0
+ var/production = 0
+ var/yield = 0
+ var/potency = 0
+ var/amount = 0
+
+datum/seed_pile/New(var/name, var/life, var/endur, var/matur, var/prod, var/yie, var/poten, var/am = 1)
+ src.name = name
+ src.lifespan = life
+ src.endurance = endur
+ src.maturation = matur
+ src.production = prod
+ src.yield = yie
+ src.potency = poten
+ src.amount = am
+
+/obj/machinery/seed_extractor/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ interact(user)
+
+obj/machinery/seed_extractor/interact(mob/user as mob)
+ if (stat)
+ return 0
+
+ var/dat = "Stored seeds:
"
+
+ if (contents.len == 0)
+ dat += "No seeds"
+ else
+ dat += "| Name | Lifespan | Endurance | Maturation | Production | Yield | Potency | Stock |
"
+ for (var/datum/seed_pile/O in piles)
+ dat += "| [O.name] | [O.lifespan] | [O.endurance] | [O.maturation] | "
+ dat += "[O.production] | [O.yield] | [O.potency] | "
+ dat += "Vend ([O.amount] left) |
"
+ dat += "
"
+ var/datum/browser/popup = new(user, "seed_ext", name, 700, 400)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+obj/machinery/seed_extractor/Topic(var/href, var/list/href_list)
+ if(..())
+ return
+ usr.set_machine(src)
+
+ href_list["li"] = text2num(href_list["li"])
+ href_list["en"] = text2num(href_list["en"])
+ href_list["ma"] = text2num(href_list["ma"])
+ href_list["pr"] = text2num(href_list["pr"])
+ href_list["yi"] = text2num(href_list["yi"])
+ href_list["pot"] = text2num(href_list["pot"])
+
+ for (var/datum/seed_pile/N in piles)//Find the pile we need to reduce...
+ if (href_list["name"] == N.name && href_list["li"] == N.lifespan && href_list["en"] == N.endurance && href_list["ma"] == N.maturation && href_list["pr"] == N.production && href_list["yi"] == N.yield && href_list["pot"] == N.potency)
+ if(N.amount <= 0)
+ return
+ N.amount = max(N.amount - 1, 0)
+ if (N.amount <= 0)
+ piles -= N
+ del(N)
+ break
+
+ for (var/obj/T in contents)//Now we find the seed we need to vend
+ var/obj/item/seeds/O = T
+ if (O.plantname == href_list["name"] && O.lifespan == href_list["li"] && O.endurance == href_list["en"] && O.maturation == href_list["ma"] && O.production == href_list["pr"] && O.yield == href_list["yi"] && O.potency == href_list["pot"])
+ O.loc = src.loc
+ break
+
+ src.updateUsrDialog()
+ return
+
+obj/machinery/seed_extractor/proc/add(var/obj/item/seeds/O as obj)
+ if(contents.len >= 999)
+ usr << "\The [src] is full."
+ return 0
+
+ if(istype(O.loc,/mob))
+ var/mob/M = O.loc
+ if(!M.unEquip(O))
+ usr << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
+ return
+ else if(istype(O.loc,/obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = O.loc
+ S.remove_from_storage(O,src)
+
+ O.loc = src
+
+ for (var/datum/seed_pile/N in piles)
+ if (O.plantname == N.name && O.lifespan == N.lifespan && O.endurance == N.endurance && O.maturation == N.maturation && O.production == N.production && O.yield == N.yield && O.potency == N.potency)
+ ++N.amount
+ return
+
+ piles += new /datum/seed_pile(O.plantname, O.lifespan, O.endurance, O.maturation, O.production, O.yield, O.potency)
+ return
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index efb0ce29746..b4e43ce2af4 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -11,6 +11,7 @@
gender = NEUTER
dna = null
faction = "alien"
+ ventcrawler = 2
var/storedPlasma = 250
var/max_plasma = 500
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 524405ec1d5..bdbb5bbcad5 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -7,6 +7,7 @@
status_flags = CANPARALYSE
heal_rate = 5
plasma_rate = 20
+ ventcrawler = 0 //pull over that ass too fat
/mob/living/carbon/alien/humanoid/queen/New()
@@ -22,7 +23,6 @@
real_name = src.name
verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin)
- verbs -= /mob/living/carbon/alien/verb/ventcrawl
..()
/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates()
@@ -85,4 +85,4 @@
else
icon_state = "queen_s"
for(var/image/I in overlays_standing)
- overlays += I
+ overlays += I
diff --git a/code/modules/mob/living/carbon/alien/powers.dm b/code/modules/mob/living/carbon/alien/powers.dm
deleted file mode 100644
index d9452a8d799..00000000000
--- a/code/modules/mob/living/carbon/alien/powers.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/alien/verb/ventcrawl() // -- TLE
- set name = "Crawl through vent"
- set desc = "Enter an air vent and crawl through the pipe system."
- set category = "Alien"
- handle_ventcrawl()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index fa1a92e449d..00f4a1e7f8e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -176,11 +176,11 @@
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
- if(halloss > 0)
+ if(hallucination)
if(prob(30))
- brutedamage += halloss
+ brutedamage += rand(30,40)
if(prob(30))
- burndamage += halloss
+ burndamage += rand(30,40)
if(brutedamage > 0)
status = "bruised"
@@ -200,6 +200,11 @@
if(status == "")
status = "OK"
src << "\t [status == "OK" ? "\blue" : "\red"] My [org.getDisplayName()] is [status]."
+ if(staminaloss)
+ if(staminaloss > 30)
+ src << "You're completely exhausted."
+ else
+ src << "You feel fatigued."
if(dna && (dna.mutantrace == "skeleton") && !H.w_uniform && !H.wear_suit)
H.play_xylophone()
else
@@ -235,99 +240,6 @@
// ++++ROCKDTBEN++++ MOB PROCS //END
-/mob/living/carbon/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null) // -- TLE -- Merged by Carn
- if(stat)
- src << "You must be conscious to do this!"
- return
- if(lying)
- src << "You can't vent crawl while you're stunned!"
- return
-
- if(vent_found) // one was passed in, probably from vent/AltClick()
- if(vent_found.welded)
- src << "That vent is welded shut."
- return
- if(!vent_found.Adjacent(src))
- return // don't even acknowledge that
- else
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
- if(!v.welded)
- if(v.Adjacent(src))
- vent_found = v
- if(!vent_found)
- src << "You'll need a non-welded vent to crawl into!"
- return
-
- if(!vent_found.network || !vent_found.network.normal_members.len)
- src << "This vent is not connected to anything."
- return
-
- var/list/vents = list()
- for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
- if(temp_vent.welded)
- continue
- if(temp_vent in loc)
- continue
- var/turf/T = get_turf(temp_vent)
-
- if(!T || T.z != loc.z)
- continue
-
- var/i = 1
- var/index = "[T.loc.name]\[[i]\]"
- while(index in vents)
- i++
- index = "[T.loc.name]\[[i]\]"
- vents[index] = temp_vent
- if(!vents.len)
- src << "\red There are no available vents to travel to, they could be welded."
- return
-
- var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents)
- if(!selection) return
-
- if(!vent_found.Adjacent(src))
- src << "Never mind, you left."
- return
-
- for(var/obj/item/carried_item in contents)//If the monkey got on objects.
- if( !istype(carried_item, /obj/item/weapon/implant) && !istype(carried_item, /obj/item/clothing/mask/facehugger) )//If it's not an implant or a facehugger
- src << "\red You can't be carrying items or have items equipped when vent crawling!"
- return
- if(isslime(src))
- var/mob/living/carbon/slime/S = src
- if(S.Victim)
- src << "\red You'll have to let [S.Victim] go or finish eating \him first."
- return
-
- var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection]
- if(!target_vent)
- return
-
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
- loc = target_vent
-
- var/travel_time = round(get_dist(loc, target_vent.loc) / 2)
-
- spawn(travel_time)
-
- if(!target_vent) return
- for(var/mob/O in hearers(target_vent,null))
- O.show_message("You hear something squeezing through the ventilation ducts.",2)
-
- sleep(travel_time)
-
- if(!target_vent) return
- if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled.
- target_vent = vent_found //travel back. No additional time required.
- src << "\red The vent you were heading to appears to be welded."
- loc = target_vent.loc
- var/area/new_area = get_area(loc)
- if(new_area)
- new_area.Entered(src)
-
-
/mob/living/carbon/clean_blood()
if(ishuman(src))
var/mob/living/carbon/human/H = src
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 430ba3f23a5..0f7690a1a4d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -182,12 +182,12 @@
msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n"
//Jitters
- if(is_jittery)
- if(jitteriness >= 300)
+ switch(jitteriness)
+ if(300 to INFINITY)
msg += "[t_He] [t_is] convulsing violently!\n"
- else if(jitteriness >= 200)
+ if(200 to 300)
msg += "[t_He] [t_is] extremely jittery.\n"
- else if(jitteriness >= 100)
+ if(100 to 200)
msg += "[t_He] [t_is] twitching ever so slightly.\n"
if(suiciding)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 3f944fcebea..525a767a0af 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -115,7 +115,7 @@ emp_act
return 0
-/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
+/mob/living/carbon/human/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
@@ -128,14 +128,12 @@ emp_act
if(I.attack_verb && I.attack_verb.len)
visible_message("[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!", \
"[src] has been [pick(I.attack_verb)] in the [hit_area] with [I] by [user]!")
- else if(I.force == 0)
- visible_message("[src] has been [pick("tapped","patted")] on the [hit_area] with [I] by [user]!", \
- "[src] has been [pick("tapped","patted")] on the [hit_area] with [I] by [user]!")
- else
+ else if(I.force)
visible_message("[src] has been attacked in the [hit_area] with [I] by [user]!", \
"[src] has been attacked in the [hit_area] with [I] by [user]!")
+ else
+ return 0
- if(!I.force) return 0
var/armor = run_armor_check(affecting, "melee", "Your armour has protected your [hit_area].", "Your armour has softened a hit to your [hit_area].")
if(armor >= 100) return 0
var/Iforce = I.force //to avoid runtimes on the forcesay checks at the bottom. Some items might delete themselves if you drop them. (stunning yourself, ninja swords)
@@ -143,7 +141,7 @@ emp_act
apply_damage(I.force, I.damtype, affecting, armor , I)
var/bloody = 0
- if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
+ if(((I.damtype == BRUTE) && prob(25 + (I.force * 2))))
if(affecting.status == ORGAN_ORGANIC)
I.add_blood(src) //Make the weapon bloody, not the person.
if(prob(I.force * 2)) //blood spatter!
@@ -211,7 +209,7 @@ emp_act
var/informed = 0
for(var/obj/item/organ/limb/L in src.organs)
if(L.status == ORGAN_ROBOTIC)
- if(!informed)
+ if(!informed)
src << "You feel a sharp pain as your robotic limbs overload."
informed = 1
switch(severity)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 923821e1658..4aa98a7e2f6 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -7,7 +7,7 @@
return -1
. = 0
- var/health_deficiency = (100 - health - halloss)
+ var/health_deficiency = (100 - health + staminaloss)
if(health_deficiency >= 40)
. += (health_deficiency / 25)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 6be5aea48bc..b5541a5647f 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -119,6 +119,7 @@
else
return ONE_ATMOSPHERE - pressure_difference
+
/mob/living/carbon/human
proc/handle_disabilities()
@@ -130,30 +131,23 @@
continue
O.show_message(text("\red [src] starts having a seizure!"), 1)
Paralyse(10)
- make_jittery(1000)
+ Jitter(1000)
if (disabilities & COUGHING)
if ((prob(5) && paralysis <= 1))
drop_item()
- spawn( 0 )
- emote("cough")
- return
+ emote("cough")
if (disabilities & TOURETTES)
if ((prob(10) && paralysis <= 1))
Stun(10)
- spawn( 0 )
- switch(rand(1, 3))
- if(1)
- emote("twitch")
- if(2 to 3)
- say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
- var/old_x = pixel_x
- var/old_y = pixel_y
- pixel_x += rand(-2,2)
- pixel_y += rand(-1,1)
- sleep(2)
- pixel_x = old_x
- pixel_y = old_y
- return
+ switch(rand(1, 3))
+ if(1)
+ emote("twitch")
+ if(2 to 3)
+ say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
+ var/x_offset = pixel_x + rand(-2,2) //Should probably be moved into the twitch emote at some point.
+ var/y_offset = pixel_y + rand(-1,1)
+ animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
+ animate(pixel_x = pixel_x - x_offset, pixel_y = pixel_y - y_offset, time = 1)
if (disabilities & NERVOUS)
if (prob(10))
stuttering = max(10, stuttering)
@@ -857,7 +851,6 @@
if(hallucination<=2)
hallucination = 0
- halloss = 0
else
hallucination -= 2
@@ -865,20 +858,13 @@
for(var/atom/a in hallucinations)
qdel(a)
- if(halloss > 100)
- src << "You're too tired to keep going..."
- for(var/mob/O in oviewers(src, null))
- O.show_message("[src] slumps to the ground panting, too weak to continue fighting.", 1)
- Paralyse(3)
- setHalLoss(99)
-
if(paralysis)
AdjustParalysis(-1)
blinded = 1
stat = UNCONSCIOUS
else if(sleeping)
handle_dreams()
- adjustHalLoss(-5)
+ adjustStaminaLoss(-10)
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
@@ -912,6 +898,50 @@
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
ear_damage = max(ear_damage-0.05, 0)
+ //Dizziness
+ if(dizziness)
+ var/client/C = client
+ var/pixel_x_diff = 0
+ var/pixel_y_diff = 0
+ var/temp
+ var/saved_dizz = dizziness
+ dizziness = max(dizziness-1, 0)
+ if(C)
+ var/oldsrc = src
+ var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
+ src = null
+ spawn(0)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
+ if(C)
+ C.pixel_x -= pixel_x_diff
+ C.pixel_y -= pixel_y_diff
+ src = oldsrc
+
+ //Jitteryness
+ if(jitteriness)
+ var/amplitude = min(4, (jitteriness/100) + 1)
+ var/pixel_x_diff = rand(-amplitude, amplitude)
+ var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
+
+ animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = -1)
+ animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2)
+ jitteriness = max(jitteriness-1, 0)
+
//Other
if(stunned)
AdjustStunned(-1)
@@ -927,6 +957,9 @@
if(druggy)
druggy = max(druggy-1, 0)
+
+ CheckStamina()
+
return 1
proc/handle_regular_hud_updates()
@@ -1089,7 +1122,7 @@
if(1) healths.icon_state = "health6"
if(2) healths.icon_state = "health7"
else
- switch(health - halloss)
+ switch(health - staminaloss)
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index dd4edff96aa..ab479dffe30 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -5,6 +5,7 @@
pass_flags = PASSTABLE
voice_message = "skree!"
say_message = "hums"
+ ventcrawler = 2
var/is_adult = 0
layer = 5
@@ -552,6 +553,64 @@
updatehealth()
return
+/mob/living/carbon/slime/attackby(obj/item/W, mob/user)
+ if(W.force > 0)
+ attacked += 10
+ if(prob(25))
+ user << "\red [W] passes right through [src]!"
+ return
+ if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
+ Discipline = 0
+ if(W.force >= 3)
+ if(is_adult)
+ if(prob(5 + round(W.force/2)))
+ if(Victim)
+ if(prob(80) && !client)
+ Discipline++
+
+ Victim = null
+ anchored = 0
+
+ spawn()
+ SStun = 1
+ sleep(rand(5,20))
+ SStun = 0
+
+ spawn(0)
+ if(user)
+ canmove = 0
+ step_away(src, user)
+ if(prob(25 + W.force))
+ sleep(2)
+ if(user)
+ step_away(src, user)
+ canmove = 1
+
+ else
+ if(prob(10 + W.force*2))
+ if(Victim)
+ if(prob(80) && !client)
+ Discipline++
+ if(Discipline == 1)
+ attacked = 0
+ spawn()
+ SStun = 1
+ sleep(rand(5,20))
+ SStun = 0
+
+ Victim = null
+ anchored = 0
+
+ spawn(0)
+ if(user)
+ canmove = 0
+ step_away(src, user)
+ if(prob(25 + W.force*4))
+ sleep(2)
+ if(user)
+ step_away(src, user)
+ canmove = 1
+ ..()
/mob/living/carbon/slime/restrained()
return 0
diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm
index b6ad88362d2..df4d2324286 100644
--- a/code/modules/mob/living/carbon/metroid/powers.dm
+++ b/code/modules/mob/living/carbon/metroid/powers.dm
@@ -225,13 +225,4 @@
else
src << "I am not ready to reproduce yet..."
else
- src << "I am not old enough to reproduce yet..."
-
-
-
-/mob/living/carbon/slime/verb/ventcrawl()
- set name = "Crawl through Vent"
- set desc = "Enter an air vent and crawl through the pipe system."
- set category = "Slime"
- if(Victim) return
- handle_ventcrawl()
\ No newline at end of file
+ src << "I am not old enough to reproduce yet..."
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index eba2999c738..f7817caf4c4 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -465,6 +465,8 @@
if(druggy)
druggy = max(druggy-1, 0)
+
+ CheckStamina()
return 1
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index f49b546d3f1..e93425f412b 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -8,6 +8,7 @@
gender = NEUTER
pass_flags = PASSTABLE
update_icon = 0 ///no need to call regenerate_icon
+ ventcrawler = 1
/mob/living/carbon/monkey/New()
create_reagents(1000)
diff --git a/code/modules/mob/living/carbon/monkey/powers.dm b/code/modules/mob/living/carbon/monkey/powers.dm
deleted file mode 100644
index e7c6937cda2..00000000000
--- a/code/modules/mob/living/carbon/monkey/powers.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/carbon/monkey/verb/ventcrawl()
- set name = "Crawl through Vent"
- set desc = "Enter an air vent and crawl through the pipe system."
- set category = "Monkey"
- handle_ventcrawl()
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 1307907b86b..10cb6ac53d6 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -23,20 +23,20 @@
adjustOxyLoss(damage * blocked)
if(CLONE)
adjustCloneLoss(damage * blocked)
- if(HALLOSS)
- adjustHalLoss(damage * blocked)
+ if(STAMINA)
+ adjustStaminaLoss(damage * blocked)
updatehealth()
return 1
-/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/halloss = 0)
+/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0)
if(blocked >= 100) return 0
if(brute) apply_damage(brute, BRUTE, def_zone, blocked)
if(burn) apply_damage(burn, BURN, def_zone, blocked)
if(tox) apply_damage(tox, TOX, def_zone, blocked)
if(oxy) apply_damage(oxy, OXY, def_zone, blocked)
if(clone) apply_damage(clone, CLONE, def_zone, blocked)
- if(halloss) apply_damage(halloss, HALLOSS, def_zone, blocked)
+ if(stamina) apply_damage(stamina, STAMINA, def_zone, blocked)
return 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 06efec3f2b1..793894e135a 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -144,16 +144,16 @@
if(status_flags & GODMODE) return 0 //godmode
brainloss = amount
-/mob/living/proc/getHalLoss()
- return halloss
+/mob/living/proc/getStaminaLoss()
+ return staminaloss
-/mob/living/proc/adjustHalLoss(var/amount)
+/mob/living/proc/adjustStaminaLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
- halloss = min(max(halloss + amount, 0),(maxHealth*2))
+ staminaloss = min(max(staminaloss + amount, 0),(maxHealth*2))
-/mob/living/proc/setHalLoss(var/amount)
+/mob/living/proc/setStaminaLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
- halloss = amount
+ staminaloss = amount
/mob/living/proc/getMaxHealth()
return maxHealth
@@ -259,7 +259,7 @@
setOxyLoss(0)
setCloneLoss(0)
setBrainLoss(0)
- setHalLoss(0)
+ setStaminaLoss(0)
SetParalysis(0)
SetStunned(0)
SetWeakened(0)
@@ -566,3 +566,16 @@
/mob/living/proc/get_visible_name()
return name
+
+/mob/living/proc/CheckStamina()
+ if(staminaloss)
+ var/total_health = (health - staminaloss)
+ if(total_health <= config.health_threshold_crit && !stat)
+ Exhaust()
+ setStaminaLoss(health - 2)
+ return
+ setStaminaLoss(max((staminaloss - 2), 0))
+
+/mob/living/proc/Exhaust()
+ src << "You're too exhausted to keep going..."
+ Weaken(5)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 9af8ddf1526..6169a45d459 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -12,7 +12,7 @@
var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt.
var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
- var/halloss = 0 //Hallucination damage. 'Fake' damage obtained through hallucinating or the holodeck. Sleeping should cause it to wear off.
+ var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this.
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
@@ -35,3 +35,5 @@
var/on_fire = 0 //The "Are we on fire?" var
var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20
+
+ var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 13a8d59523b..afd34dddece 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -274,7 +274,7 @@
if (src.client)
src.client.screen -= src.contents
for(var/obj/I in src.contents)
- if(I && !(istype(I,/obj/item/weapon/cell) || istype(I,/obj/item/device/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/device/mmi)))
+ if(I && !(istype(I,/obj/item/weapon/stock_parts/cell) || istype(I,/obj/item/device/radio) || istype(I,/obj/machinery/camera) || istype(I,/obj/item/device/mmi)))
src.client.screen += I
if(src.module_state_1)
src.module_state_1:screen_loc = ui_inv1
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 50f506a7e85..994039724a0 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -27,7 +27,7 @@
var/obj/item/device/radio/borg/radio = null
var/mob/living/silicon/ai/connected_ai = null
- var/obj/item/weapon/cell/cell = null
+ var/obj/item/weapon/stock_parts/cell/cell = null
var/obj/machinery/camera/camera = null
var/obj/item/device/mmi/mmi = null
@@ -75,7 +75,7 @@
updateicon()
if(!cell)
- cell = new /obj/item/weapon/cell(src)
+ cell = new /obj/item/weapon/stock_parts/cell(src)
cell.maxcharge = 7500
cell.charge = 7500
@@ -434,7 +434,7 @@
opened = 1
updateicon()
- else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
+ else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
if(wiresexposed)
user << "Close the cover first."
else if(cell)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 7f0903a235e..4568c2335b2 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -106,6 +106,19 @@
src << "\red Warning: Electromagnetic pulse detected."
..()
+/mob/living/silicon/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0)
+ blocked = (100-blocked)/100
+ if(!damage || (blocked <= 0)) return 0
+ switch(damagetype)
+ if(BRUTE)
+ adjustBruteLoss(damage * blocked)
+ if(BURN)
+ adjustFireLoss(damage * blocked)
+ else
+ return 1
+ updatehealth()
+ return 1
+
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
return
@@ -118,7 +131,8 @@
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj.nodamage) adjustBruteLoss(Proj.damage)
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ adjustBruteLoss(Proj.damage)
Proj.on_hit(src,2)
return 2
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 64472877810..6f266ee0703 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -106,9 +106,8 @@
/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- adjustBruteLoss(damage)
+ if(O.damtype == BURN || O.damtype == BRUTE)
+ adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("[src] has been attacked with [O] by [user]!")
@@ -118,6 +117,14 @@
if ((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with [O]. ")
+/mob/living/simple_animal/construct/bullet_act(var/obj/item/projectile/Proj)
+ if(!Proj)
+ return
+ if(Proj.damage_type == BURN || Proj.damage_type == BRUTE)
+ adjustBruteLoss(Proj.damage)
+ Proj.on_hit(src, 0)
+ return 0
+
/////////////////Juggernaut///////////////
@@ -147,10 +154,8 @@
/mob/living/simple_animal/construct/armoured/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
if(O.force >= 11)
- var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- adjustBruteLoss(damage)
+ if(O.damtype == BURN || O.damtype == BRUTE)
+ adjustBruteLoss(O.force)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("[src] has been attacked with [O] by [user]!")
@@ -169,7 +174,8 @@
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 80 - round(P.damage/3)
if(prob(reflectchance))
- adjustBruteLoss(P.damage * 0.5)
+ if(P.damage_type == BURN || P.damage_type == BRUTE)
+ adjustBruteLoss(P.damage * 0.5)
visible_message("The [P.name] gets reflected by [src]'s shell!", \
"The [P.name] gets reflected by [src]'s shell!")
@@ -272,7 +278,7 @@
if(O.force)
if(O.force >= 11)
var/damage = O.force
- if (O.damtype == HALLOSS)
+ if (O.damtype == STAMINA)
damage = 0
adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 31d833a5198..efed432d09e 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -16,6 +16,7 @@
response_harm = "stomps"
stop_automated_movement = 1
friendly = "pinches"
+ ventcrawler = 2
var/obj/item/inventory_head
var/obj/item/inventory_mask
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 84a0315361e..ac5350437e2 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -166,6 +166,7 @@
response_harm = "kicks"
attacktext = "kicks"
health = 1
+ ventcrawler = 2
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE
@@ -206,6 +207,7 @@ var/global/chicken_count = 0
response_harm = "kicks"
attacktext = "kicks"
health = 10
+ ventcrawler = 2
var/eggsleft = 0
var/body_color
pass_flags = PASSTABLE
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 48b5685e6dc..5cfb67fa0e3 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -13,4 +13,5 @@
melee_damage_upper = 2
response_help = "pets"
response_disarm = "shoos"
- response_harm = "stomps on"
\ No newline at end of file
+ response_harm = "stomps on"
+ ventcrawler = 2
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 3e18c879197..6b3751e633f 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -18,6 +18,7 @@
response_disarm = "gently pushes aside"
response_harm = "splats"
density = 0
+ ventcrawler = 2
var/body_color //brown, gray and white, leave blank for random
/mob/living/simple_animal/mouse/New()
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
index 6408325623e..fa1f72b3871 100644
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ b/code/modules/mob/living/simple_animal/friendly/slime.dm
@@ -12,6 +12,7 @@
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
+ ventcrawler = 2
var/colour = "grey"
/mob/living/simple_animal/slime/Bump(atom/movable/AM as mob|obj, yes)
@@ -72,4 +73,4 @@
S2.icon_living = "[src.colour] baby slime"
S2.icon_dead = "[src.colour] baby slime dead"
S2.colour = "[src.colour]"
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/friendly/tomato.dm b/code/modules/mob/living/simple_animal/friendly/tomato.dm
index 57c0f4c939b..30e675e5a8e 100644
--- a/code/modules/mob/living/simple_animal/friendly/tomato.dm
+++ b/code/modules/mob/living/simple_animal/friendly/tomato.dm
@@ -12,4 +12,5 @@
response_help = "prods"
response_disarm = "pushes aside"
response_harm = "smacks"
- harm_intent_damage = 5
\ No newline at end of file
+ harm_intent_damage = 5
+ ventcrawler = 2
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index c4e1c38c32d..e0a39a8aa8d 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -34,6 +34,7 @@
var/busy = 0
pass_flags = PASSTABLE
move_to_delay = 6
+ ventcrawler = 2
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index 81bb4a1bfcc..8bb13918998 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -22,6 +22,7 @@
stat_attack = 2
mouse_opacity = 1
speed = 1
+ ventcrawler = 2
var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms
var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it
var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight
@@ -156,4 +157,4 @@
S.reagents.add_reagent("mushroomhallucinogen", powerlevel)
S.reagents.add_reagent("doctorsdelight", powerlevel)
S.reagents.add_reagent("synaptizine", powerlevel)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
index 5c575649e83..8e32e320b36 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm
@@ -23,6 +23,7 @@
faction = "carp"
attack_sound = 'sound/weapons/bite.ogg'
environment_smash = 0
+ ventcrawler = 2
//Space bats need no air to fly in.
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 5152aecff79..b11bfb23441 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -61,7 +61,7 @@
if(O.force)
if(prob(80))
var/damage = O.force
- if (O.damtype == HALLOSS)
+ if (O.damtype == STAMINA)
damage = 0
health -= damage
visible_message("[src] has been attacked with [O] by [user]!")
@@ -75,7 +75,8 @@
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(65))
- src.health -= Proj.damage
+ if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
+ src.health -= Proj.damage
else
visible_message("\red [src] blocks [Proj] with its shield!")
return 0
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 403c6427631..07b0d85c86e 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -46,7 +46,7 @@
else
if(O.force)
var/damage = O.force
- if (O.damtype == HALLOSS)
+ if (O.damtype == STAMINA)
damage = 0
health -= damage
for(var/mob/M in viewers(src, null))
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 52420916d18..3d0547573fa 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -261,9 +261,11 @@
adjustBruteLoss(damage)
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj) return
- adjustBruteLoss(Proj.damage)
- Proj.on_hit(src, 0)
+ if(!Proj)
+ return
+ if((Proj.damage_type != STAMINA))
+ adjustBruteLoss(Proj.damage)
+ Proj.on_hit(src, 0)
return 0
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
@@ -407,7 +409,7 @@
else
if(O.force)
var/damage = O.force
- if (O.damtype == HALLOSS)
+ if (O.damtype == STAMINA)
damage = 0
adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 31f4a400c67..874c5413508 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -582,79 +582,6 @@ var/list/slot_equipment_priority = list( \
for(var/mob/M in viewers())
M.see(message)
-/*
-adds a dizziness amount to a mob
-use this rather than directly changing var/dizziness
-since this ensures that the dizzy_process proc is started
-currently only humans get dizzy
-
-value of dizziness ranges from 0 to 1000
-below 100 is not dizzy
-*/
-/mob/proc/make_dizzy(var/amount)
- if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
- return
-
- dizziness = min(1000, dizziness + amount) // store what will be new value
- // clamped to max 1000
- if(dizziness > 100 && !is_dizzy)
- spawn(0)
- dizzy_process()
-
-
-/*
-dizzy process - wiggles the client's pixel offset over time
-spawned from make_dizzy(), will terminate automatically when dizziness gets <100
-note dizziness decrements automatically in the mob's Life() proc.
-*/
-/mob/proc/dizzy_process()
- is_dizzy = 1
- while(dizziness > 100)
- if(client)
- var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70
- client.pixel_x = amplitude * sin(0.008 * dizziness * world.time)
- client.pixel_y = amplitude * cos(0.008 * dizziness * world.time)
-
- sleep(1)
- //endwhile - reset the pixel offsets to zero
- is_dizzy = 0
- if(client)
- client.pixel_x = 0
- client.pixel_y = 0
-
-// jitteriness - copy+paste of dizziness
-
-/mob/proc/make_jittery(var/amount)
- if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
- return
-
- jitteriness = min(1000, jitteriness + amount) // store what will be new value
- // clamped to max 1000
- if(jitteriness > 100 && !is_jittery)
- spawn(0)
- jittery_process()
-
-
-// Typo from the oriignal coder here, below lies the jitteriness process. So make of his code what you will, the previous comment here was just a copypaste of the above.
-/mob/proc/jittery_process()
- var/old_x = pixel_x
- var/old_y = pixel_y
- is_jittery = 1
- while(jitteriness > 100)
-// var/amplitude = jitteriness*(sin(jitteriness * 0.044 * world.time) + 1) / 70
-// pixel_x = amplitude * sin(0.008 * jitteriness * world.time)
-// pixel_y = amplitude * cos(0.008 * jitteriness * world.time)
-
- var/amplitude = min(4, jitteriness / 100)
- pixel_x = rand(-amplitude, amplitude)
- pixel_y = rand(-amplitude/3, amplitude/3)
-
- sleep(1)
- //endwhile - reset the pixel offsets to zero
- is_jittery = 0
- pixel_x = old_x
- pixel_y = old_y
-
/mob/Stat()
..()
@@ -782,6 +709,11 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
return 0
+/mob/proc/Jitter(amount)
+ jitteriness = max(jitteriness,amount,0)
+
+/mob/proc/Dizzy(amount)
+ dizziness = max(dizziness,amount,0)
/mob/proc/Stun(amount)
if(status_flags & CANSTUN)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index eb2c904c047..1a6896915c9 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -74,8 +74,6 @@
var/bodytemperature = 310.055 //98.7 F
var/drowsyness = 0//Carbon
var/dizziness = 0//Carbon
- var/is_dizzy = 0
- var/is_jittery = 0
var/jitteriness = 0//Carbon
var/nutrition = 400//Carbon
@@ -167,4 +165,4 @@
var/robot_talk_understand = 0
var/alien_talk_understand = 0
- var/turf/listed_turf = null //the current turf being examined in the stat panel
+ var/turf/listed_turf = null //the current turf being examined in the stat panel
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 70acfee9961..afe906099ad 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -52,7 +52,7 @@
req_access = list(access_engine_equip)
var/area/area
var/areastring = null
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
var/start_charge = 90 // initial cell charge %
var/cell_type = 2500 // 0=no cell, 1=regular, 2=high-cap (x5) <- old, now it's just 0=no cell, otherwise dictate cellcapacity by changing this value. 1 used to be 1000, 2 was 2500
var/opened = 0 //0=closed, 1=opened, 2=cover removed
@@ -165,7 +165,7 @@
has_electronics = 2 //installed and secured
// is starting with a power cell installed, create it and set its charge level
if(cell_type)
- src.cell = new/obj/item/weapon/cell(src)
+ src.cell = new/obj/item/weapon/stock_parts/cell(src)
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
@@ -405,7 +405,7 @@
else
opened = 1
update_icon()
- else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
+ else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
if(cell)
user << "There is a power cell already installed."
return
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 939ff0701e3..bc6cad2a655 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -2,14 +2,14 @@
// charge from 0 to 100%
// fits in APC to provide backup power
-/obj/item/weapon/cell/New()
+/obj/item/weapon/stock_parts/cell/New()
..()
charge = maxcharge
spawn(5)
updateicon()
-/obj/item/weapon/cell/proc/updateicon()
+/obj/item/weapon/stock_parts/cell/proc/updateicon()
overlays.Cut()
if(charge < 0.01)
@@ -19,11 +19,11 @@
else
overlays += image('icons/obj/power.dmi', "cell-o1")
-/obj/item/weapon/cell/proc/percent() // return % charge of cell
+/obj/item/weapon/stock_parts/cell/proc/percent() // return % charge of cell
return 100.0*charge/maxcharge
// use power from a cell
-/obj/item/weapon/cell/proc/use(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/use(var/amount)
if(rigged && amount > 0)
explode()
return 0
@@ -33,7 +33,7 @@
return 1
// recharge the cell
-/obj/item/weapon/cell/proc/give(var/amount)
+/obj/item/weapon/stock_parts/cell/proc/give(var/amount)
if(rigged && amount > 0)
explode()
return 0
@@ -50,7 +50,7 @@
return power_used
-/obj/item/weapon/cell/examine()
+/obj/item/weapon/stock_parts/cell/examine()
set src in view(1)
..()
if(usr /*&& !usr.stat*/)
@@ -58,7 +58,7 @@
if(crit_fail)
usr << "\red This power cell seems to be faulty."
-/obj/item/weapon/cell/attack_self(mob/user as mob)
+/obj/item/weapon/stock_parts/cell/attack_self(mob/user as mob)
src.add_fingerprint(user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -68,7 +68,7 @@
SNG.drain("CELL",src,H.wear_suit)
return
-/obj/item/weapon/cell/attackby(obj/item/W, mob/user)
+/obj/item/weapon/stock_parts/cell/attackby(obj/item/W, mob/user)
..()
if(istype(W, /obj/item/weapon/reagent_containers/syringe))
var/obj/item/weapon/reagent_containers/syringe/S = W
@@ -82,7 +82,7 @@
S.reagents.clear_reagents()
-/obj/item/weapon/cell/proc/explode()
+/obj/item/weapon/stock_parts/cell/proc/explode()
var/turf/T = get_turf(src.loc)
/*
* 1000-cell explosion(T, -1, 0, 1, 1)
@@ -105,13 +105,13 @@
qdel(src)
-/obj/item/weapon/cell/proc/corrupt()
+/obj/item/weapon/stock_parts/cell/proc/corrupt()
charge /= 2
maxcharge /= 2
if (prob(10))
rigged = 1 //broken batterys are dangerous
-/obj/item/weapon/cell/emp_act(severity)
+/obj/item/weapon/stock_parts/cell/emp_act(severity)
charge -= 1000 / severity
if (charge < 0)
charge = 0
@@ -119,7 +119,7 @@
reliability -= 10 / severity
..()
-/obj/item/weapon/cell/ex_act(severity)
+/obj/item/weapon/stock_parts/cell/ex_act(severity)
switch(severity)
if(1.0)
@@ -139,10 +139,10 @@
corrupt()
return
-/obj/item/weapon/cell/blob_act()
+/obj/item/weapon/stock_parts/cell/blob_act()
ex_act(1)
-/obj/item/weapon/cell/proc/get_electrocute_damage()
+/obj/item/weapon/stock_parts/cell/proc/get_electrocute_damage()
switch (charge)
/* if (9000 to INFINITY)
return min(rand(90,150),rand(90,150))
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index a71e0204c29..9a7f1bc443f 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -221,6 +221,9 @@ display round(lastgen) and plasmatank amount
emp_act(1)
else if(!active)
+ if(exchange_parts(user, O))
+ return
+
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
@@ -242,7 +245,7 @@ display round(lastgen) and plasmatank amount
else
user << "\blue You close the access panel."
else if(istype(O, /obj/item/weapon/crowbar) && panel_open)
- default_deconstruction_crowbar()
+ default_deconstruction_crowbar(O)
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
..()
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 2509075a27b..19cc68b7a98 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -537,11 +537,11 @@
power_source = Cable.powernet
var/datum/powernet/PN
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
if(istype(power_source,/datum/powernet))
PN = power_source
- else if(istype(power_source,/obj/item/weapon/cell))
+ else if(istype(power_source,/obj/item/weapon/stock_parts/cell))
cell = power_source
else if(istype(power_source,/obj/machinery/power/apc))
var/obj/machinery/power/apc/apc = power_source
@@ -576,7 +576,7 @@
else if (istype(power_source,/datum/powernet))
var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts"
PN.newload+=drained_power
- else if (istype(power_source, /obj/item/weapon/cell))
+ else if (istype(power_source, /obj/item/weapon/stock_parts/cell))
cell.use(drained_energy)
return drained_energy
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index ed5f38cbded..c430e891271 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -30,11 +30,11 @@
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/smes(null)
- component_parts += new /obj/item/weapon/cell/high(null)
- component_parts += new /obj/item/weapon/cell/high(null)
- component_parts += new /obj/item/weapon/cell/high(null)
- component_parts += new /obj/item/weapon/cell/high(null)
- component_parts += new /obj/item/weapon/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/stack/cable_coil(null, 5)
RefreshParts()
@@ -61,7 +61,7 @@
IO += CP.rating
input_level_max = 200000 * IO
output_level_max = 200000 * IO
- for(var/obj/item/weapon/cell/PC in component_parts)
+ for(var/obj/item/weapon/stock_parts/cell/PC in component_parts)
C += PC.maxcharge
capacity = C / (15000) * 1e6
@@ -92,6 +92,9 @@
update_icon()
return
+ if(exchange_parts(user, I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/power/smes/Destroy()
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index ca8d2bb75d1..78f9dc86020 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -121,6 +121,9 @@
stat |= BROKEN
return
+ if(exchange_parts(user, I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/power/compressor/CanAtmosPass(var/turf/T)
@@ -281,6 +284,9 @@
stat |= BROKEN
return
+ if(exchange_parts(user, I))
+ return
+
default_deconstruction_crowbar(I)
/obj/machinery/power/turbine/interact(mob/user)
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 819c228617b..90834ff8489 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -34,11 +34,11 @@
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/bluetag
- projectile_type = /obj/item/projectile/bluetag
+ projectile_type = /obj/item/projectile/lasertag/bluetag
select_name = "bluetag"
/obj/item/ammo_casing/energy/laser/redtag
- projectile_type = /obj/item/projectile/redtag
+ projectile_type = /obj/item/projectile/lasertag/redtag
select_name = "redtag"
/obj/item/ammo_casing/energy/bolt
@@ -110,3 +110,9 @@
select_name = "kinetic"
e_cost = 500
fire_sound = 'sound/weapons/Gunshot4.ogg'
+
+/obj/item/ammo_casing/energy/disabler
+ projectile_type = /obj/item/projectile/energy/disabler
+ select_name = "disable"
+ e_cost = 50
+ fire_sound = "sound/weapons/taser.ogg"
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index bc3f4208b9f..83011631293 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -3,8 +3,8 @@
name = "energy gun"
desc = "A basic energy-based gun."
- var/obj/item/weapon/cell/power_supply //What type of power cell this uses
- var/cell_type = /obj/item/weapon/cell
+ var/obj/item/weapon/stock_parts/cell/power_supply //What type of power cell this uses
+ var/cell_type = /obj/item/weapon/stock_parts/cell
var/modifystate = 0
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index c57d098f37b..fda36d89093 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -5,7 +5,7 @@
item_state = null //so the human update icon uses the icon_state instead.
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- cell_type = "/obj/item/weapon/cell/super"
+ cell_type = "/obj/item/weapon/stock_parts/cell/super"
/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob)
@@ -14,7 +14,7 @@
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
name = "pulse destroyer"
desc = "A heavy-duty, pulse-based energy weapon."
- cell_type = "/obj/item/weapon/cell/infinite"
+ cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse)
/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob)
@@ -26,6 +26,6 @@
name = "m1911-P"
desc = "It's not the size of the gun, it's the size of the hole it puts through people."
icon_state = "m1911-p"
- cell_type = "/obj/item/weapon/cell/infinite"
+ cell_type = "/obj/item/weapon/stock_parts/cell/infinite"
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 57536e741c3..37ad30a4144 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -57,7 +57,7 @@
item_state = "c20r"
w_class = 4
ammo_type = list(/obj/item/ammo_casing/energy/meteor)
- cell_type = "/obj/item/weapon/cell/potato"
+ cell_type = "/obj/item/weapon/stock_parts/cell/potato"
clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
var/charge_tick = 0
var/recharge_time = 5 //Time it takes for shots to recharge (in ticks)
@@ -103,7 +103,7 @@
icon_state = "kineticgun"
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
- cell_type = "/obj/item/weapon/cell/crap"
+ cell_type = "/obj/item/weapon/stock_parts/cell/crap"
var/overheat = 0
var/recent_reload = 1
@@ -121,4 +121,12 @@
playsound(src.loc, 'sound/weapons/shotgunpump.ogg', 60, 1)
recent_reload = 1
update_icon()
- return
\ No newline at end of file
+ return
+
+/obj/item/weapon/gun/energy/disabler
+ name = "disabler"
+ desc = "A self defense weapon that exhausts targets, weakening them until they collapse. Non-lethal."
+ icon_state = "disabler"
+ item_state = null
+ ammo_type = list(/obj/item/ammo_casing/energy/disabler)
+ cell_type = "/obj/item/weapon/stock_parts/cell"
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 382db0571cd..c510c4294e3 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -5,14 +5,14 @@
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
ammo_type = list(/obj/item/ammo_casing/energy/electrode)
- cell_type = "/obj/item/weapon/cell/crap"
+ cell_type = "/obj/item/weapon/stock_parts/cell/crap"
/obj/item/weapon/gun/energy/taser/cyborg
name = "taser gun"
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
fire_sound = 'sound/weapons/Taser.ogg'
- cell_type = "/obj/item/weapon/cell/secborg"
+ cell_type = "/obj/item/weapon/stock_parts/cell/secborg"
var/charge_tick = 0
var/recharge_time = 10 //Time it takes for shots to recharge (in ticks)
@@ -48,7 +48,7 @@
icon_state = "stunrevolver"
origin_tech = "combat=3;materials=3;powerstorage=2"
ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
- cell_type = "/obj/item/weapon/cell"
+ cell_type = "/obj/item/weapon/stock_parts/cell"
@@ -62,7 +62,7 @@
origin_tech = "combat=2;magnets=2;syndicate=5"
silenced = 1
ammo_type = list(/obj/item/ammo_casing/energy/bolt)
- cell_type = "/obj/item/weapon/cell/crap"
+ cell_type = "/obj/item/weapon/stock_parts/cell/crap"
var/charge_tick = 0
diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm
index 33023dab775..4ee91f98982 100644
--- a/code/modules/projectiles/guns/energy/temperature.dm
+++ b/code/modules/projectiles/guns/energy/temperature.dm
@@ -4,7 +4,7 @@
desc = "A gun that changes temperatures."
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
- cell_type = "/obj/item/weapon/cell/high"
+ cell_type = "/obj/item/weapon/stock_parts/cell/high"
attack_self(mob/living/user as mob)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 4bda18157a1..c6cf2abb843 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -57,50 +57,28 @@
damage = 30
-/obj/item/projectile/bluetag
+/obj/item/projectile/lasertag
name = "lasertag beam"
- icon_state = "bluelaser"
- hitsound = null
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 0
- damage_type = BURN
- flag = "laser"
-
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
- M.Weaken(5)
- return 1
-
-/obj/item/projectile/redtag
- name = "lasertag beam"
- icon_state = "laser"
- hitsound = null
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 0
- damage_type = BURN
- flag = "laser"
-
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
- M.Weaken(5)
- return 1
-
-/obj/item/projectile/omnitag//A laser tag bolt that stuns EVERYONE
- name = "lasertag beam"
- hitsound = null
icon_state = "omnilaser"
- pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+ hitsound = null
damage = 0
- damage_type = BURN
+ damage_type = STAMINA
flag = "laser"
+ pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
+ var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag)))
- M.Weaken(5)
- return 1
\ No newline at end of file
+/obj/item/projectile/lasertag/on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(istype(M.wear_suit))
+ if(M.wear_suit.type in suit_types)
+ M.adjustStaminaLoss(34)
+ return 1
+
+/obj/item/projectile/lasertag/redtag
+ icon_state = "laser"
+ suit_types = list(/obj/item/clothing/suit/bluetag)
+
+/obj/item/projectile/lasertag/bluetag
+ icon_state = "bluelaser"
+ suit_types = list(/obj/item/clothing/suit/redtag)
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index ea13aa4050a..fba3302ac90 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -52,9 +52,17 @@
name = "largebolt"
damage = 20
-
-
-
+/obj/item/projectile/energy/disabler
+ name = "disabler beam"
+ icon_state = "omnilaser"
+ damage = 34
+ damage_type = STAMINA
+ var/range = 7
+
+/obj/item/projectile/energy/disabler/Range()
+ range--
+ if(range <= 0)
+ delete()
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 20c1b6ae171..c21f82abaf0 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -204,7 +204,7 @@
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/capacitor(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/cell/high(null)
+ component_parts += new /obj/item/weapon/stock_parts/cell/high(null)
RefreshParts()
/obj/machinery/chem_dispenser/constructable/RefreshParts()
@@ -217,7 +217,7 @@
max_energy = temp_energy * 5 //max energy = (bin1.rating + bin2.rating - 1) * 5, 5 on lowest 25 on highest
for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts)
time += C.rating
- for(var/obj/item/weapon/cell/P in component_parts)
+ for(var/obj/item/weapon/stock_parts/cell/P in component_parts)
time += round(P.maxcharge, 10000) / 10000
recharge_delay /= time/2 //delay between recharges, double the usual time on lowest 50% less than usual on highest
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
@@ -229,6 +229,9 @@
if(default_deconstruction_screwdriver(user, "minidispenser-o", "minidispenser", I))
return
+ if(exchange_parts(user, I))
+ return
+
if(panel_open)
if(istype(I, /obj/item/weapon/crowbar))
if(beaker)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 04c5cd6aa75..013be2113b1 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -266,7 +266,7 @@ datum
if(data >= 30)
if (!M.stuttering) M.stuttering = 1
M.stuttering += 4
- M.make_dizzy(5)
+ M.Dizzy(5)
if(data >= 30*2.5 && prob(33))
if (!M.confused) M.confused = 1
M.confused += 3
@@ -825,7 +825,7 @@ datum
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
- M.make_dizzy(1)
+ M.Dizzy(1)
if(!M.confused) M.confused = 1
M.confused = max(M.confused, 20)
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
@@ -1151,8 +1151,8 @@ datum
M.status_flags &= ~DISFIGURED
if(35 to INFINITY)
M.adjustToxLoss(1)
- M.make_dizzy(5)
- M.make_jittery(5)
+ M.Dizzy(5)
+ M.Jitter(5)
..()
return
@@ -1995,18 +1995,18 @@ datum
switch(data)
if(1 to 5)
if (!M.stuttering) M.stuttering = 1
- M.make_dizzy(5)
+ M.Dizzy(5)
if(prob(10)) M.emote(pick("twitch","giggle"))
if(5 to 10)
if (!M.stuttering) M.stuttering = 1
- M.make_jittery(10)
- M.make_dizzy(10)
+ M.Jitter(10)
+ M.Dizzy(10)
M.druggy = max(M.druggy, 35)
if(prob(20)) M.emote(pick("twitch","giggle"))
if (10 to INFINITY)
if (!M.stuttering) M.stuttering = 1
- M.make_jittery(20)
- M.make_dizzy(20)
+ M.Jitter(20)
+ M.Dizzy(20)
M.druggy = max(M.druggy, 40)
if(prob(30)) M.emote(pick("twitch","giggle"))
holder.remove_reagent(src.id, 0.2)
@@ -2394,7 +2394,7 @@ datum
M.sleeping = max(0,M.sleeping - 2)
if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
if(holder.has_reagent("frostoil"))
holder.remove_reagent("frostoil", 5)
..()
@@ -2434,7 +2434,7 @@ datum
M.sleeping = max(0,M.sleeping-2)
if (M.bodytemperature > 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
..()
return
@@ -2479,7 +2479,7 @@ datum
color = "#100800" // rgb: 16, 8, 0
on_mob_life(var/mob/living/M as mob)
- M.make_jittery(20)
+ M.Jitter(20)
M.druggy = max(M.druggy, 30)
M.dizziness +=5
M.drowsyness = 0
@@ -2502,7 +2502,7 @@ datum
M.sleeping = max(0,M.sleeping-1)
if (M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
M.nutrition += 1
..()
return
@@ -2608,7 +2608,7 @@ datum
M.sleeping = 0
if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
M.nutrition++
..()
@@ -2628,7 +2628,7 @@ datum
M.sleeping = 0
if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
if(M.getBruteLoss() && prob(20)) M.heal_organ_damage(1,0)
M.nutrition++
..()
@@ -2664,7 +2664,7 @@ datum
on_mob_life(var/mob/living/M as mob)
M.druggy = max(M.druggy, 50)
M.confused = max(M.confused+2,0)
- M.make_dizzy(10)
+ M.Dizzy(10)
if (!M.stuttering) M.stuttering = 1
M.stuttering += 3
if(!data) data = 1
@@ -2741,24 +2741,24 @@ datum
switch(data)
if(1 to 5)
if (!M.stuttering) M.stuttering = 1
- M.make_dizzy(10)
+ M.Dizzy(10)
if(prob(10)) M.emote(pick("twitch","giggle"))
if(5 to 10)
if (!M.stuttering) M.stuttering = 1
- M.make_jittery(20)
- M.make_dizzy(20)
+ M.Jitter(20)
+ M.Dizzy(20)
M.druggy = max(M.druggy, 45)
if(prob(20)) M.emote(pick("twitch","giggle"))
if (10 to 200)
if (!M.stuttering) M.stuttering = 1
- M.make_jittery(40)
- M.make_dizzy(40)
+ M.Jitter(40)
+ M.Dizzy(40)
M.druggy = max(M.druggy, 60)
if(prob(30)) M.emote(pick("twitch","giggle"))
if(200 to INFINITY)
if (!M.stuttering) M.stuttering = 1
- M.make_jittery(60)
- M.make_dizzy(60)
+ M.Jitter(60)
+ M.Dizzy(60)
M.druggy = max(M.druggy, 75)
if(prob(40)) M.emote(pick("twitch","giggle"))
if(prob(30)) M.adjustToxLoss(2)
@@ -2789,7 +2789,7 @@ datum
if(data >= boozepwr)
if (!M.stuttering) M.stuttering = 1
M.stuttering += 4
- M.make_dizzy(5)
+ M.Dizzy(5)
if(data >= boozepwr*2.5 && prob(33))
if (!M.confused) M.confused = 1
M.confused += 3
@@ -2841,7 +2841,7 @@ datum
M.dizziness = max(0,M.dizziness-5)
M.drowsyness = max(0,M.drowsyness-3)
M.sleeping = max(0,M.sleeping-2)
- M.make_jittery(5)
+ M.Jitter(5)
..()
return
@@ -2864,7 +2864,7 @@ datum
M.sleeping = max(0,M.sleeping-2)
if (M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
- M.make_jittery(5)
+ M.Jitter(5)
M.nutrition += 1
..()
return
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index d21700c8f9f..6cc3b2dddef 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1238,6 +1238,7 @@ datum/chemical_reaction/pestkiller
T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50)
//Yellow
+
/datum/chemical_reaction/slimeoverload
name = "Slime EMP"
id = "m_emp"
@@ -1261,7 +1262,7 @@ datum/chemical_reaction/pestkiller
required_other = 1
/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/cell/slime/P = new /obj/item/weapon/cell/slime
+ var/obj/item/weapon/stock_parts/cell/slime/P = new /obj/item/weapon/stock_parts/cell/slime
P.loc = get_turf(holder.my_atom)
/datum/chemical_reaction/slimeglow
@@ -2111,4 +2112,4 @@ datum/chemical_reaction/pestkiller
id = "thirteenloko"
result = "thirteenloko"
required_reagents = list("vodka" = 1, "coffee" = 1, "limejuice" = 1)
- result_amount = 3
\ No newline at end of file
+ result_amount = 3
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 1735b1cd110..d827cdda3a1 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -14,119 +14,122 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
var/diamond_amount = 0
var/max_material_amount = 75000.0
var/efficiency_coeff
+ reagents = new()
- New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
- component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
- RefreshParts()
-
+/obj/machinery/r_n_d/circuit_imprinter/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
+ component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
RefreshParts()
- var/T = 0
- for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
- T += G.reagents.maximum_volume
- var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
- reagents = R
- R.my_atom = src
- T = 0
- for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- T += M.rating
- max_material_amount = T * 75000.0
- T = 0
- for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
- T += M.rating
- efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas
+ reagents.my_atom = src
- blob_act()
- if (prob(50))
- qdel(src)
+/obj/machinery/r_n_d/circuit_imprinter/RefreshParts()
+ var/T = 0
+ for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
+ G.reagents.trans_to(src, G.reagents.total_volume)
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ T += M.rating
+ max_material_amount = T * 75000.0
+ T = 0
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ T += M.rating
+ efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas
- meteorhit()
+/obj/machinery/r_n_d/circuit_imprinter/blob_act()
+ if (prob(50))
qdel(src)
+
+/obj/machinery/r_n_d/circuit_imprinter/meteorhit()
+ del(src)
+ return
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/check_mat(datum/design/being_built, var/M)
+ switch(M)
+ if("$glass")
+ return (g_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
+ if("$gold")
+ return (gold_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
+ if("$diamond")
+ return (diamond_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
+ else
+ return (reagents.has_reagent(M, (being_built.materials[M]/efficiency_coeff)) != 0) ? 1 : 0
+
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
+ return g_amount + gold_amount + diamond_amount
+
+/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if (shocked)
+ shock(user,50)
+ if (default_deconstruction_screwdriver(user, "circuit_imprinter_t", "circuit_imprinter", O))
+ if(linked_console)
+ linked_console.linked_imprinter = null
+ linked_console = null
return
- proc/check_mat(datum/design/being_built, var/M)
- switch(M)
- if("$glass")
- return (g_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
- if("$gold")
- return (gold_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
- if("$diamond")
- return (diamond_amount - (being_built.materials[M]/efficiency_coeff) >= 0) ? 1 : 0
- else
- return (reagents.has_reagent(M, (being_built.materials[M]/efficiency_coeff)) != 0) ? 1 : 0
+ if(exchange_parts(user, O))
+ return
+ if (panel_open)
+ if(istype(O, /obj/item/weapon/crowbar))
+ for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
+ reagents.trans_to(G, G.reagents.maximum_volume)
+ if(g_amount >= 3750)
+ var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc)
+ G.amount = round(g_amount / 3750)
+ if(gold_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc)
+ G.amount = round(gold_amount / 2000)
+ if(diamond_amount >= 2000)
+ var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
+ G.amount = round(diamond_amount / 2000)
+ default_deconstruction_crowbar(O)
+ return
+ else
+ user << "\red You can't load the [src.name] while it's opened."
+ return
+ if (disabled)
+ return
+ if (!linked_console)
+ user << "\The [name] must be linked to an R&D console first!"
+ return 1
+ if (O.is_open_container())
+ return
+ if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond))
+ user << "\red You cannot insert this item into the [name]!"
+ return
+ if (stat)
+ return
+ if (busy)
+ user << "\red The [name] is busy. Please wait for completion of previous operation."
+ return
+ var/obj/item/stack/sheet/stack = O
+ if ((TotalMaterials() + stack.perunit) > max_material_amount)
+ user << "\red The [name] is full. Please remove glass from the protolathe in order to insert more."
+ return
- proc/TotalMaterials()
- return g_amount + gold_amount + diamond_amount
+ var/amount = round(input("How many sheets do you want to add?") as num)
+ if(amount < 0)
+ amount = 0
+ if(amount == 0)
+ return
+ if(amount > stack.amount)
+ amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit))
- attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (shocked)
- shock(user,50)
- if (default_deconstruction_screwdriver(user, "circuit_imprinter_t", "circuit_imprinter", O))
- if(linked_console)
- linked_console.linked_imprinter = null
- linked_console = null
- return
-
- if (panel_open)
- if(istype(O, /obj/item/weapon/crowbar))
- if(g_amount >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc)
- G.amount = round(g_amount / 3750)
- if(gold_amount >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc)
- G.amount = round(gold_amount / 2000)
- if(diamond_amount >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
- G.amount = round(diamond_amount / 2000)
- default_deconstruction_crowbar(O)
- return
- else
- user << "\red You can't load the [src.name] while it's opened."
- return
- if (disabled)
- return
- if (!linked_console)
- user << "\The [name] must be linked to an R&D console first!"
- return
- if (O.is_open_container())
- return
- if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond))
- user << "\red You cannot insert this item into the [name]!"
- return
- if (stat)
- return
- if (busy)
- user << "\red The [name] is busy. Please wait for completion of previous operation."
- return
- var/obj/item/stack/sheet/stack = O
- if ((TotalMaterials() + stack.perunit) > max_material_amount)
- user << "\red The [name] is full. Please remove glass from the protolathe in order to insert more."
- return
-
- var/amount = round(input("How many sheets do you want to add?") as num)
- if(amount < 0)
- amount = 0
- if(amount == 0)
- return
- if(amount > stack.amount)
- amount = min(stack.amount, round((max_material_amount-TotalMaterials())/stack.perunit))
-
- busy = 1
- use_power(max(1000, (3750*amount/10)))
- spawn(16)
- user << "\blue You add [amount] sheets to the [src.name]."
- if(istype(stack, /obj/item/stack/sheet/glass))
- g_amount += amount * 3750
- else if(istype(stack, /obj/item/stack/sheet/mineral/gold))
- gold_amount += amount * 2000
- else if(istype(stack, /obj/item/stack/sheet/mineral/diamond))
- diamond_amount += amount * 2000
- stack.use(amount)
- busy = 0
- src.updateUsrDialog()
+ busy = 1
+ use_power(max(1000, (3750*amount/10)))
+ spawn(16)
+ user << "\blue You add [amount] sheets to the [src.name]."
+ if(istype(stack, /obj/item/stack/sheet/glass))
+ g_amount += amount * 3750
+ else if(istype(stack, /obj/item/stack/sheet/mineral/gold))
+ gold_amount += amount * 2000
+ else if(istype(stack, /obj/item/stack/sheet/mineral/diamond))
+ diamond_amount += amount * 2000
+ stack.use(amount)
+ busy = 0
+ src.updateUsrDialog()
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 4645c62db8c..9ff29c42127 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -921,6 +921,16 @@ datum/design/tech_disk
/////////////Stock Parts////////////////
////////////////////////////////////////
+datum/design/RPED
+ name = "Rapid Part Exchange Device"
+ desc = "Special mechanical module made to store, sort, and apply standart machine parts."
+ id = "rped"
+ req_tech = list("engineering" = 3,
+ "materials" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 15000, "$glass" = 5000) //hardcore
+ build_path = /obj/item/weapon/storage/part_replacer
+
datum/design/basic_capacitor
name = "Basic Capacitor"
desc = "A stock part used in the construction of various devices."
@@ -1146,7 +1156,7 @@ datum/design/basic_cell
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE |MECHFAB
materials = list("$metal" = 700, "$glass" = 50)
- build_path = /obj/item/weapon/cell
+ build_path = /obj/item/weapon/stock_parts/cell
category = "Misc"
datum/design/high_cell
@@ -1156,7 +1166,7 @@ datum/design/high_cell
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 60)
- build_path = /obj/item/weapon/cell/high
+ build_path = /obj/item/weapon/stock_parts/cell/high
category = "Misc"
datum/design/super_cell
@@ -1167,7 +1177,7 @@ datum/design/super_cell
reliability = 75
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 70)
- build_path = /obj/item/weapon/cell/super
+ build_path = /obj/item/weapon/stock_parts/cell/super
category = "Misc"
datum/design/hyper_cell
@@ -1178,7 +1188,7 @@ datum/design/hyper_cell
reliability = 70
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
- build_path = /obj/item/weapon/cell/hyper
+ build_path = /obj/item/weapon/stock_parts/cell/hyper
category = "Misc"
datum/design/light_replacer
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 092efaa27ea..3649c8ba438 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -48,6 +48,9 @@ Note: Must be placed within 3 tiles of the R&D Console
linked_console = null
return
+ if(exchange_parts(user, O))
+ return
+
default_deconstruction_crowbar(O)
if (disabled)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 98ad25ff86a..b03cf5ec19c 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -23,6 +23,7 @@ Note: Must be placed west/left of and R&D console to function.
var/clown_amount = 0.0
var/adamantine_amount = 0.0
var/efficiency_coeff
+ reagents = new()
/obj/machinery/r_n_d/protolathe/New()
@@ -36,6 +37,7 @@ Note: Must be placed west/left of and R&D console to function.
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
RefreshParts()
+ reagents.my_atom = src
/obj/machinery/r_n_d/protolathe/proc/TotalMaterials() //returns the total of all the stored materials. Makes code neater.
return m_amount + g_amount + gold_amount + silver_amount + plasma_amount + uranium_amount + diamond_amount + clown_amount
@@ -43,11 +45,7 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/RefreshParts()
var/T = 0
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
- T += G.reagents.maximum_volume
- var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
- reagents = R
- R.my_atom = src
- T = 0
+ G.reagents.trans_to(src, G.reagents.total_volume)
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
T += M.rating
max_material_storage = T * 75000
@@ -86,8 +84,14 @@ Note: Must be placed west/left of and R&D console to function.
linked_console.linked_lathe = null
linked_console = null
return
+
+ if(exchange_parts(user, O))
+ return
+
if (panel_open)
if(istype(O, /obj/item/weapon/crowbar))
+ for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
+ reagents.trans_to(G, G.reagents.maximum_volume)
if(m_amount >= 3750)
var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(src.loc)
G.amount = round(m_amount / G.perunit)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 76b5a55451e..d64b0b01da1 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -132,6 +132,8 @@
shock(user,50)
if (default_deconstruction_screwdriver(user, "server_o", "server", O))
return
+ if(exchange_parts(user, O))
+ return
if (panel_open)
if(istype(O, /obj/item/weapon/crowbar))
griefProtection()
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 1af0d1ecd75..b491373968c 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -37,6 +37,9 @@
M.buffer = src
user << "You save the data in the [I.name]'s buffer."
+ if(exchange_parts(user, I))
+ return
+
default_deconstruction_crowbar(I)
diff --git a/code/unused/Agouri_stuff.dm b/code/unused/Agouri_stuff.dm
index c81e7f7c0eb..f8f970a1c86 100644
--- a/code/unused/Agouri_stuff.dm
+++ b/code/unused/Agouri_stuff.dm
@@ -192,7 +192,7 @@
//var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
//the values in this list show how much damage will pass through, not how much will be absorbed.
var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
- var/obj/item/weapon/cell/cell //Our power source
+ var/obj/item/weapon/stock_parts/cell/cell //Our power source
var/state = 0
var/list/log = new
var/last_message = 0
@@ -269,7 +269,7 @@
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
return internal_tank*/
-/obj/vehicle/proc/add_cell(var/obj/item/weapon/cell/C=null)
+/obj/vehicle/proc/add_cell(var/obj/item/weapon/stock_parts/cell/C=null)
if(C)
C.forceMove(src)
cell = C
diff --git a/code/unused/powerarmor/powerarmorcomponents.dm b/code/unused/powerarmor/powerarmorcomponents.dm
index dbac3a6098a..de25f064743 100644
--- a/code/unused/powerarmor/powerarmorcomponents.dm
+++ b/code/unused/powerarmor/powerarmorcomponents.dm
@@ -42,7 +42,7 @@
powercell
name = "Powercell interface"
desc = "Boring, but reliable."
- var/obj/item/weapon/cell/cell
+ var/obj/item/weapon/stock_parts/cell/cell
slowdown = 0.5
process()
diff --git a/html/changelog.html b/html/changelog.html
index 094a498c348..2fa29a045fa 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -52,25 +52,132 @@ should be listed in the changelog upon commit tho. Thanks. -->
-
-
-
-
17 February 2014
-
Ergovisavi updated:
-
- - Mining has been significantly overhauled. Hostile alien life has infested the western asteroid! Miners are given an equipment voucher to obtain equipment to protect themselves. There is a spare voucher in the HoP's office, should someone want to switch to mining mid-shift.
- - The Ore Redemption Machine has been added just outside of the Science wing. Ore goes in, Sheets go out, and points are tallied on the machine. Insert your ID to claim points, then spend them on goods at Mining Equipment Lockers. You require specific accesses to tell the Ore Redemption Machine to unload its sheets.
- - Should you not care for being eaten alive by horrible alien life, it is suggested you stick to the eastern asteroid, where there is no hostile alien life... though the yield on ore is not as good.
- - Most ore is no longer visible to the naked eye. You must ping it with a Mining Scanner (Available in all mining lockers) to locate nearby ore. Make sure to equip your mesons first, or it won't be visible.
- - Mesons no longer remove the darkness overlay, you must properly light your environment. Hull breaches to space can still be clearly seen, and it will still protect you from the singulo.
- - Mineral spawn rates have been significantly tweaked to cut down on unnecessary inflation of mineral economy.
- - The asteroid no longer has ambient power on the entire asteroid. AI's who go onto asteroid turf will slowly die of power loss. Mining outposts are unaffected.
- - Fixed an issue where projectiles shot by simple mobs or thrown would hit multiple times.
-
-
-
+
+
+
5 march 2014
+
Various Coders updated:
+
+ - Ling rounds are LINGIER, with more lings at a given population.
+ - Many simple animals can ventcrawl, including bats. All ventcrawlers must alt-click to ventcrawl.
+ - An automatic tool to store and replace machine parts has been added to R&D.
+ - Most stuns have been reduced in from 10+ to 5 ticks in duration.
+ - Shoes no longer speed you up.
+ - Added fancy suits, which can be orderd from cargo.
+ - Added sombrerors and ponches.
+ - Cuff application time reduced 25%.
+ - Fire will cause fuel tanks to explode.
+ - Mutagen has been reduced in lethality. Notably, 15 units are not guaranteed to crit the recipient.
+
+
+
+
+
+
3 march 2014
+
Miauw updated:
+
+ - Changelings have a new power, Dissonant Shriek. This power causes an EMP in the surrounding area.
+
+
+
+
+
3 March 2014
+
Incoming5643 updated:
+
+ - Improved blob spores to zombify people adjacent to their tile.
+ - If a hand-teleporter is activated while you're stuck inside a wall, you'll automatically go through it.
+
+
Miauw updated:
+
+ - Decreased the lethality of Mutagen in small doses.
+
+
Drovidi Corv updated:
+
+ - Facehuggers no longer die to zero-force weapons or projectiles like lasertag beams.
+
+
TZK13 updated:
+
+ - Added Incendiary Shotgun Shells made at a hacked autolathe; Xenos be wary.
+
+
ChuckTheSheep updated:
+
+ - Round-end report now shows what items were bought with a traitor's or nuke-op's uplink and how many TCs they used.
+
+
+
+
+
26 February 2014
+
Incoming5643 updated:
+
+ - Color blending Kitty Ears have returned.
+
+
+
+
+
25 February 2014
+
Incoming5643 updated:
+
+ - Colored burgers! Include a crayon in your microwave when cooking a burger and it'll come out just like a Pretty Pattie.
+ - Fixed AI's being able to interact with syndicate bombs.
+
+
+
+
+
24 February 2014
+
Miauw updated:
+
+ - No more removing cursed horseheads.
+
+
Incoming5643 updated:
+
+ - Improved the Syndicate Implant bundle to contain freedom, uplink, EMP, adrenalin and explosive implanters.
+ - Added Mineral Storeroom to R&D containing the Ore Redemption Machine; no more assistants stealing your ore in the open hallway.
+
+
Ergovisavi updated:
+
+ - Added Advanced Mesons and Night Vision Goggles to the protolathe.
+
+
HornyGranny updated:
+
+ - Reduced the range of Violin notes.
+ - Low quality violin midi-notes replaced with better .ogg-notes.
+
+
Giacom updated:
+
+ - Silicons no longer stop statues from moving when in sight.
+ - Increased the health of statues.
+ - Increased the range of statues's blinding spell.
+
+
Razharas updated:
+
+ - Fixed infinite telecrystal exploit.
+
+
+
+
+
19 February 2014
+
Perakp updated:
+
+ - Added Iatot's cyborg module selection transformation animations.
+
+
Aranclanos updated:
+
+ - Removed the chance of your hat falling off when slipping.
+
+
+
17 February 2014
+
Ergovisavi updated:
+
+ - Mining has been significantly overhauled. Hostile alien life has infested the western asteroid! Miners are given an equipment voucher to obtain equipment to protect themselves. There is a spare voucher in the HoP's office, should someone want to switch to mining mid-shift.
+ - The Ore Redemption Machine has been added just outside of the Science wing. Ore goes in, Sheets go out, and points are tallied on the machine. Insert your ID to claim points, then spend them on goods at Mining Equipment Lockers. You require specific accesses to tell the Ore Redemption Machine to unload its sheets.
+ - Should you not care for being eaten alive by horrible alien life, it is suggested you stick to the eastern asteroid, where there is no hostile alien life... though the yield on ore is not as good.
+ - Most ore is no longer visible to the naked eye. You must ping it with a Mining Scanner (Available in all mining lockers) to locate nearby ore. Make sure to equip your mesons first, or it won't be visible.
+ - Mesons no longer remove the darkness overlay, you must properly light your environment. Hull breaches to space can still be clearly seen, and it will still protect you from the singulo.
+ - Mineral spawn rates have been significantly tweaked to cut down on unnecessary inflation of mineral economy.
+ - The asteroid no longer has ambient power on the entire asteroid. AI's who go onto asteroid turf will slowly die of power loss. Mining outposts are unaffected.
+ - Fixed an issue where projectiles shot by simple mobs or thrown would hit multiple times.
+
Fleure updated:
- Reduced chicken crates to contain 1-3 chicks, down from 3-6
@@ -113,57 +220,57 @@ should be listed in the changelog upon commit tho. Thanks. -->
-
-
9 February 2014
-
Demas updated:
-
- - Banana peel size is based on banana size.
- - Bigger peels slip for longer than smaller ones. Remember that produce size is based on potency.
- - The clown now spawns with a decent sized banana.
- - The banana mortar now shoots 65 potency peels.
-
-
+
+
9 February 2014
+
Demas updated:
+
+ - Banana peel size is based on banana size.
+ - Bigger peels slip for longer than smaller ones. Remember that produce size is based on potency.
+ - The clown now spawns with a decent sized banana.
+ - The banana mortar now shoots 65 potency peels.
+
+
-
-
-
8 February 2014
-
Razharas updated:
-
- - Adds more constructible and deconstructable machines!
- - Added constructible miniature chemical dispensers, upgradable
- - Sleepers are now constructible and upgradable, open and close like DNA scanners, and don't require a console
- - Cryogenic tubes are now constructible and upgradable, open and close like DNA scanners, and you can set the cryogenic tube's pipe's direction by opening its panel and wrenching it to connect it to piping
- - Telescience pads are now constructible and upgradable
- - Telescience consoles are now constructible
- - Telescience tweaked (you can save data on GPS units now)
- - Teleporters are now constructible and upgradable, the console has a new interface and you can lock onto places saved to GPS units in telescience
- - Teleporters start unconnected. You need to manually reconnect the console, station and hub by opening the panel of the station and applying wire cutters to it.
- - Biogenerators are now constructible and upgradable
- - Atmospherics heaters and freezers are now constructible and upgradable and can be rotated with a wrench when their panel is open to connect them to pipes. Screw the board to switch between heater and freezer.
- - Mech chargers are now constructible and upgradable
- - Microwaves are now constructible and upgradable
- - All kitchen machinery can now be wrenched free
- - SMES are now constructible
- - Dragging a human's sprite to a cryogenic tube or sleeper will put them inside and activate it if it's cryo
- - Constructible newscasters, their frames are made with autolathes
- - Constructible pandemics
- - Constructible power turbines and their computers
- - Constructible power compressors
- - Constructible vending machines. Screw the board to switch vendor type.
- - Constructible hydroponics trays
- - Sprites for all this
- - This update will have unforeseen bugs, please report those you find at https://github.com/tgstation/-tg-station/issues/new if you want them fixed.
- - As usual, machines are deconstructed by screwing open their panels and crowbarring them. While constructing machines, examining them will tell you what parts you're missing.
-
-
-
-
-
8 February 2014
-
MrPerson updated:
-
- - Added a NanoUI for the SMES
-
-
+
+
+
8 February 2014
+
Razharas updated:
+
+ - Adds more constructible and deconstructable machines!
+ - Added constructible miniature chemical dispensers, upgradable
+ - Sleepers are now constructible and upgradable, open and close like DNA scanners, and don't require a console
+ - Cryogenic tubes are now constructible and upgradable, open and close like DNA scanners, and you can set the cryogenic tube's pipe's direction by opening its panel and wrenching it to connect it to piping
+ - Telescience pads are now constructible and upgradable
+ - Telescience consoles are now constructible
+ - Telescience tweaked (you can save data on GPS units now)
+ - Teleporters are now constructible and upgradable, the console has a new interface and you can lock onto places saved to GPS units in telescience
+ - Teleporters start unconnected. You need to manually reconnect the console, station and hub by opening the panel of the station and applying wire cutters to it.
+ - Biogenerators are now constructible and upgradable
+ - Atmospherics heaters and freezers are now constructible and upgradable and can be rotated with a wrench when their panel is open to connect them to pipes. Screw the board to switch between heater and freezer.
+ - Mech chargers are now constructible and upgradable
+ - Microwaves are now constructible and upgradable
+ - All kitchen machinery can now be wrenched free
+ - SMES are now constructible
+ - Dragging a human's sprite to a cryogenic tube or sleeper will put them inside and activate it if it's cryo
+ - Constructible newscasters, their frames are made with autolathes
+ - Constructible pandemics
+ - Constructible power turbines and their computers
+ - Constructible power compressors
+ - Constructible vending machines. Screw the board to switch vendor type.
+ - Constructible hydroponics trays
+ - Sprites for all this
+ - This update will have unforeseen bugs, please report those you find at https://github.com/tgstation/-tg-station/issues/new if you want them fixed.
+ - As usual, machines are deconstructed by screwing open their panels and crowbarring them. While constructing machines, examining them will tell you what parts you're missing.
+
+
+
+
+
8 February 2014
+
MrPerson updated:
+
+ - Added a NanoUI for the SMES
+
+
diff --git a/icons/BadAss.dmi b/icons/BadAss.dmi
new file mode 100644
index 00000000000..fcf27d53e60
Binary files /dev/null and b/icons/BadAss.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index dbd9650e215..51e8beb438a 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index edb97243990..6c2bf978072 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
index ac1d17b541e..a381819c3b8 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 64dd82ced6d..b886ea28b58 100644
Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 9a805ab162f..3dab309036e 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index acfb656c318..c0d073039bb 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 63241a21829..40dfee34b6e 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 85d6c7b58b5..372aa8e8c28 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 6c14e3f929d..1612bfde40e 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index c857e0d39d4..a424ea49f5e 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index e8aba5cf9e3..b276c27df71 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 50e8e5b0a6c..1e3090a1c63 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 0b236287b7c..618b58b78c7 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 77a6f9cfe2a..03e4bae5b5f 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index e11c6279f13..a759f4fc3d8 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 7500246843c..9e19dd63388 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -895,7 +895,6 @@
#include "code\modules\mob\living\carbon\alien\death.dm"
#include "code\modules\mob\living\carbon\alien\login.dm"
#include "code\modules\mob\living\carbon\alien\logout.dm"
-#include "code\modules\mob\living\carbon\alien\powers.dm"
#include "code\modules\mob\living\carbon\alien\say.dm"
#include "code\modules\mob\living\carbon\alien\screen.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
@@ -962,7 +961,6 @@
#include "code\modules\mob\living\carbon\monkey\life.dm"
#include "code\modules\mob\living\carbon\monkey\login.dm"
#include "code\modules\mob\living\carbon\monkey\monkey.dm"
-#include "code\modules\mob\living\carbon\monkey\powers.dm"
#include "code\modules\mob\living\carbon\monkey\say.dm"
#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
#include "code\modules\mob\living\silicon\death.dm"