mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Merge with dev.
This commit is contained in:
@@ -19,4 +19,5 @@ install:
|
||||
script:
|
||||
- shopt -s globstar
|
||||
- (! grep 'step_[xy]' maps/**/*.dmm)
|
||||
- (! find nano/templates/ -type f -exec md5sum {} + | sort | uniq -D -w 32 | grep nano)
|
||||
- DreamMaker baystation12.dme
|
||||
|
||||
@@ -59,4 +59,4 @@
|
||||
|
||||
|
||||
/datum/controller/process/machinery/getStatName()
|
||||
return ..()+"([machines.len])"
|
||||
return ..()+"([machines.len])"
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
var/global/list/processing_turfs = list()
|
||||
var/global/list/turf/processing_turfs = list()
|
||||
|
||||
/datum/controller/process/turf/setup()
|
||||
name = "turf"
|
||||
schedule_interval = 20 // every 2 seconds
|
||||
|
||||
/datum/controller/process/turf/doWork()
|
||||
for(var/turf/unsimulated/wall/supermatter/SM in processing_turfs)
|
||||
SM.process()
|
||||
for(var/turf/T in processing_turfs)
|
||||
if(T.process() == PROCESS_KILL)
|
||||
processing_turfs.Remove(T)
|
||||
scheck()
|
||||
|
||||
/datum/controller/process/turf/getStatName()
|
||||
return ..()+"([processing_turfs.len])"
|
||||
|
||||
@@ -114,6 +114,10 @@ var/list/gamemode_cache = list()
|
||||
|
||||
var/organ_health_multiplier = 1
|
||||
var/organ_regeneration_multiplier = 1
|
||||
|
||||
//Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt,
|
||||
//so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun.
|
||||
var/organ_damage_spillover_multiplier = 0.5
|
||||
|
||||
var/bones_can_break = 0
|
||||
var/limbs_can_break = 0
|
||||
@@ -670,6 +674,8 @@ var/list/gamemode_cache = list()
|
||||
config.organ_health_multiplier = value / 100
|
||||
if("organ_regeneration_multiplier")
|
||||
config.organ_regeneration_multiplier = value / 100
|
||||
if("organ_damage_spillover_multiplier")
|
||||
config.organ_damage_spillover_multiplier = value / 100
|
||||
if("bones_can_break")
|
||||
config.bones_can_break = value
|
||||
if("limbs_can_break")
|
||||
|
||||
@@ -39,7 +39,6 @@ datum/controller/game_controller/proc/setup()
|
||||
|
||||
setup_objects()
|
||||
setupgenetics()
|
||||
setup_economy()
|
||||
SetupXenoarch()
|
||||
|
||||
transfer_controller = new
|
||||
|
||||
@@ -257,7 +257,7 @@ datum/controller/vote
|
||||
text += "\n[question]"
|
||||
|
||||
log_vote(text)
|
||||
world << "<font color='purple'><b>[text]</b>\nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
|
||||
world << "<font color='purple'><b>[text]</b>\nType <b>vote</b> or click <a href='?src=\ref[src]'>here</a> to place your votes.\nYou have [config.vote_period/10] seconds to vote.</font>"
|
||||
switch(vote_type)
|
||||
if("crew_transfer")
|
||||
world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
data_core = new /obj/effect/datacore()
|
||||
return 1
|
||||
|
||||
/obj/effect/datacore/proc/manifest(var/nosleep = 0)
|
||||
/obj/effect/datacore/proc/manifest()
|
||||
spawn()
|
||||
if(!nosleep)
|
||||
sleep(40)
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
manifest_inject(H)
|
||||
return
|
||||
|
||||
@@ -37,10 +37,11 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
var/haspower = A.arePowerSystemsOn() //If there's no power, then no lights will be on.
|
||||
|
||||
. += ..()
|
||||
. += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]",
|
||||
. += text("<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]<br>\n[]",
|
||||
(A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
|
||||
((A.lights && haspower) ? "The door bolt lights are on." : "The door bolt lights are off!"),
|
||||
((haspower) ? "The test light is on." : "The test light is off!"),
|
||||
((A.backupPowerCablesCut()) ? "The backup power light is off!" : "The backup power light is on."),
|
||||
((A.aiControlDisabled==0 && !A.emagged && haspower)? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
|
||||
((A.safe==0 && haspower)? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
|
||||
((A.normalspeed==0 && haspower)? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
|
||||
@@ -124,7 +125,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
//Sending a pulse through flashes the red light on the door (if the door has power).
|
||||
if(A.arePowerSystemsOn() && A.density)
|
||||
A.do_animate("deny")
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1 || AIRLOCK_WIRE_MAIN_POWER2)
|
||||
if(AIRLOCK_WIRE_MAIN_POWER1, AIRLOCK_WIRE_MAIN_POWER2)
|
||||
//Sending a pulse through either one causes a breaker to trip, disabling the door for 10 seconds if backup power is connected, or 1 minute if not (or until backup power comes back on, whichever is shorter).
|
||||
A.loseMainPower()
|
||||
if(AIRLOCK_WIRE_DOOR_BOLTS)
|
||||
@@ -135,7 +136,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
|
||||
else
|
||||
A.unlock()
|
||||
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1 || AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
if(AIRLOCK_WIRE_BACKUP_POWER1, AIRLOCK_WIRE_BACKUP_POWER2)
|
||||
//two wires for backup power. Sending a pulse through either one causes a breaker to trip, but this does not disable it unless main power is down too (in which case it is disabled for 1 minute or however long it takes main power to come back, whichever is shorter).
|
||||
A.loseBackupPower()
|
||||
if(AIRLOCK_WIRE_AI_CONTROL)
|
||||
|
||||
@@ -278,6 +278,11 @@ var/const/POWER = 8
|
||||
var/r = rand(1, wires.len)
|
||||
CutWireIndex(r)
|
||||
|
||||
/datum/wires/proc/RandomCutAll(var/probability = 10)
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
if(prob(probability))
|
||||
CutWireIndex(i)
|
||||
|
||||
/datum/wires/proc/CutAll()
|
||||
for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
|
||||
CutWireIndex(i)
|
||||
|
||||
@@ -175,47 +175,91 @@
|
||||
origin_tech = "materials=1"
|
||||
var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/weapon/legcuffs/beartrap
|
||||
/obj/item/weapon/beartrap
|
||||
name = "bear trap"
|
||||
throw_speed = 2
|
||||
throw_range = 1
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "beartrap0"
|
||||
desc = "A trap used to catch bears and other legged creatures."
|
||||
var/armed = 0
|
||||
throwforce = 0
|
||||
w_class = 3.0
|
||||
origin_tech = "materials=1"
|
||||
var/deployed = 0
|
||||
|
||||
suicide_act(mob/user)
|
||||
viewers(user) << "\red <b>[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide.</b>"
|
||||
viewers(user) << "<span class='danger'>[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide.</span>"
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/legcuffs/beartrap/attack_self(mob/user as mob)
|
||||
/obj/item/weapon/beartrap/attack_self(mob/user as mob)
|
||||
..()
|
||||
if(ishuman(user) && !user.stat && !user.restrained())
|
||||
armed = !armed
|
||||
icon_state = "beartrap[armed]"
|
||||
user << "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>"
|
||||
if(deployed==0)
|
||||
user.visible_message("<span class='danger'>[user] is deploying \the [src]</span>", "<span class='danger'>You are deploying \the [src]!</span>")
|
||||
if (do_after(user, 60))
|
||||
user.visible_message("<span class='danger'>[user] has deployed \the [src]</span>", "<span class='danger'>You have deployed \the [src]!</span>")
|
||||
deployed = 1
|
||||
user.drop_from_inventory(src, user.loc)
|
||||
update_icon()
|
||||
anchored = 1
|
||||
|
||||
/obj/item/weapon/legcuffs/beartrap/Crossed(AM as mob|obj)
|
||||
if(armed)
|
||||
/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
|
||||
if(ishuman(user) && !user.stat && !user.restrained())
|
||||
if(deployed==1)
|
||||
user.visible_message("<span class='danger'>[user] is disarming \the [src]</span>", "<span class='danger'>You are disarming \the [src]!</span>")
|
||||
if (do_after(user, 60))
|
||||
user.visible_message("<span class='danger'>[user] has disarmed \the [src]</span>", "<span class='danger'>You have disarmed \the [src]!</span>")
|
||||
deployed = 0
|
||||
anchored = 0
|
||||
update_icon()
|
||||
|
||||
if(deployed==0)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
|
||||
if(deployed)
|
||||
if(ishuman(AM))
|
||||
if(isturf(src.loc))
|
||||
var/mob/living/carbon/H = AM
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(H.m_intent == "run")
|
||||
armed = 0
|
||||
H.legcuffed = src
|
||||
src.loc = H
|
||||
H.update_inv_legcuffed()
|
||||
H << "\red <B>You step on \the [src]!</B>"
|
||||
feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
|
||||
deployed = 0
|
||||
update_icon()
|
||||
H << "<span class='danger'>You step on \the [src]!</span>"
|
||||
for(var/mob/O in viewers(H, null))
|
||||
if(O == H)
|
||||
continue
|
||||
O.show_message("\red <B>[H] steps on \the [src].</B>", 1)
|
||||
O.show_message("<span class='danger'>[H] steps on \the [src].</span>", 1)
|
||||
if(H.lying)
|
||||
var/obj/item/organ/external/affecting = pick(H.organs)
|
||||
if(affecting.take_damage(30, 0))
|
||||
H.UpdateDamageIcon()
|
||||
affecting.embed(src)
|
||||
else
|
||||
var/list/potentialorgans = list()
|
||||
for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot"))
|
||||
var/obj/item/organ/external/R = H.get_organ(organ)
|
||||
if(R && !(R.status & ORGAN_DESTROYED))
|
||||
potentialorgans += R
|
||||
var/obj/item/organ/external/affecting = pick(potentialorgans)
|
||||
if(affecting.take_damage(30, 0))
|
||||
H.UpdateDamageIcon()
|
||||
affecting.embed(src)
|
||||
|
||||
|
||||
if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
|
||||
armed = 0
|
||||
deployed = 0
|
||||
var/mob/living/simple_animal/SA = AM
|
||||
SA.health -= 20
|
||||
..()
|
||||
|
||||
/obj/item/weapon/beartrap/update_icon()
|
||||
..()
|
||||
|
||||
if(deployed == 0)
|
||||
icon_state = "beartrap0"
|
||||
else
|
||||
icon_state = "beartrap1"
|
||||
|
||||
|
||||
/obj/item/weapon/caution
|
||||
|
||||
@@ -98,7 +98,7 @@ proc/statistic_cycle()
|
||||
return
|
||||
while(1)
|
||||
sql_poll_population()
|
||||
sleep(600)
|
||||
sleep(6000)
|
||||
|
||||
//This proc is used for feedback. It is executed at round end.
|
||||
proc/sql_commit_feedback()
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
processing_turfs.Remove(src)
|
||||
..()
|
||||
|
||||
/turf/unsimulated/wall/supermatter/proc/process()
|
||||
/turf/unsimulated/wall/supermatter/process()
|
||||
// Only check infrequently.
|
||||
if(next_check>world.time) return
|
||||
|
||||
|
||||
@@ -110,11 +110,11 @@ var/global/datum/controller/gameticker/ticker
|
||||
else
|
||||
src.mode.announce()
|
||||
|
||||
current_state = GAME_STATE_PLAYING
|
||||
create_characters() //Create player characters and transfer them
|
||||
collect_minds()
|
||||
equip_characters()
|
||||
data_core.manifest()
|
||||
current_state = GAME_STATE_PLAYING
|
||||
|
||||
callHook("roundstart")
|
||||
|
||||
@@ -155,7 +155,6 @@ var/global/datum/controller/gameticker/ticker
|
||||
for(var/obj/multiz/ladder/L in world) L.connect() //Lazy hackfix for ladders. TODO: move this to an actual controller. ~ Z
|
||||
|
||||
if(config.sql_enabled)
|
||||
spawn(3000)
|
||||
statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE
|
||||
|
||||
return 1
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
access_hydroponics, access_library, access_lawyer, access_virology, access_psychiatrist, access_cmo, access_qm, access_clown, access_mime, access_surgery,
|
||||
access_theatre, access_research, access_mining, access_mailsorting,
|
||||
access_heads_vault, access_mining_station, access_xenobiology, access_ce, access_hop, access_hos, access_RC_announce,
|
||||
access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch)
|
||||
access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_medical_equip)
|
||||
|
||||
/proc/get_all_centcom_access()
|
||||
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
|
||||
|
||||
@@ -305,15 +305,15 @@
|
||||
faction = "Station"
|
||||
total_positions = 2
|
||||
spawn_positions = 2
|
||||
supervisors = "the captain"
|
||||
supervisors = "Nanotrasen officials and Corporate Regulations"
|
||||
selection_color = "#dddddd"
|
||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors)
|
||||
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels, access_heads)
|
||||
minimal_access = list(access_lawyer, access_court, access_sec_doors, access_heads)
|
||||
|
||||
|
||||
equip(var/mob/living/carbon/human/H)
|
||||
if(!H) return 0
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/ia(H), slot_l_ear)
|
||||
switch(H.backbag)
|
||||
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
|
||||
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
//Perform the connection
|
||||
connected_port = new_port
|
||||
connected_port.connected_device = src
|
||||
connected_port.on = 1 //Activate port updates
|
||||
|
||||
anchored = 1 //Prevent movement
|
||||
|
||||
|
||||
@@ -305,7 +305,14 @@
|
||||
|
||||
if("destination")
|
||||
refresh=0
|
||||
var/new_dest = input("Enter new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", destination) as text|null
|
||||
var/new_dest
|
||||
var/list/beaconlist = new()
|
||||
for(var/obj/machinery/navbeacon/N in navbeacons)
|
||||
beaconlist.Add(N.location)
|
||||
if(beaconlist.len)
|
||||
new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]", destination) in beaconlist
|
||||
else
|
||||
alert("No destination beacons available.")
|
||||
refresh=1
|
||||
if(new_dest)
|
||||
set_destination(new_dest)
|
||||
@@ -741,11 +748,6 @@
|
||||
if(!on)
|
||||
return
|
||||
|
||||
/*
|
||||
world << "rec signal: [signal.source]"
|
||||
for(var/x in signal.data)
|
||||
world << "* [x] = [signal.data[x]]"
|
||||
*/
|
||||
var/recv = signal.data["command"]
|
||||
// process all-bot input
|
||||
if(recv=="bot_status" && wires.RemoteRX())
|
||||
|
||||
@@ -226,6 +226,8 @@
|
||||
//Used when someone breaks a camera
|
||||
/obj/machinery/camera/proc/destroy()
|
||||
stat |= BROKEN
|
||||
wires.RandomCutAll()
|
||||
|
||||
kick_viewers()
|
||||
triggerCameraAlarm()
|
||||
update_icon()
|
||||
|
||||
@@ -82,7 +82,7 @@ for reference:
|
||||
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/D = W
|
||||
if(D.material != material)
|
||||
if(D.material.name != material.name)
|
||||
user << "<span class='warning'>That is the wrong material needed to repair \the [src].</span>"
|
||||
return
|
||||
if (health < maxhealth)
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
// Navigation beacon for AI robots
|
||||
// Functions as a transponder: looks for incoming signal matching
|
||||
|
||||
|
||||
var/global/list/navbeacons // no I don't like putting this in, but it will do for now
|
||||
|
||||
/obj/machinery/navbeacon
|
||||
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
@@ -27,6 +30,13 @@
|
||||
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
|
||||
// add beacon to MULE bot beacon list
|
||||
if(freq == 1400)
|
||||
if(!navbeacons)
|
||||
navbeacons = new()
|
||||
navbeacons += src
|
||||
|
||||
|
||||
spawn(5) // must wait for map loading to finish
|
||||
if(radio_controller)
|
||||
@@ -241,6 +251,7 @@ Transponder Codes:<UL>"}
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/navbeacon/Destroy()
|
||||
navbeacons.Remove(src)
|
||||
if(radio_controller)
|
||||
radio_controller.remove_object(src, freq)
|
||||
..()
|
||||
|
||||
@@ -212,6 +212,13 @@
|
||||
freerange = 1
|
||||
ks2type = /obj/item/device/encryptionkey/ert
|
||||
|
||||
/obj/item/device/radio/headset/ia
|
||||
name = "internal affair's headset"
|
||||
desc = "The headset of your worst enemy."
|
||||
icon_state = "com_headset"
|
||||
item_state = "headset"
|
||||
ks2type = /obj/item/device/encryptionkey/heads/hos
|
||||
|
||||
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
// ..()
|
||||
user.set_machine(src)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/obj/item/weapon/material/sword/katana
|
||||
name = "katana"
|
||||
desc = "Woefully underpowered in D20"
|
||||
desc = "Woefully underpowered in D20. This one looks pretty sharp."
|
||||
icon_state = "katana"
|
||||
item_state = "katana"
|
||||
slot_flags = SLOT_BELT | SLOT_BACK
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
if(wielded)
|
||||
M << "<span class='warning'>Unwield the [base_name] first!</span>"
|
||||
return 0
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/material/twohanded/dropped(mob/user as mob)
|
||||
@@ -148,17 +149,24 @@
|
||||
force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
|
||||
sharp = 1
|
||||
edge = 1
|
||||
w_class = 4.0
|
||||
slot_flags = SLOT_BACK
|
||||
force_wielded = 30
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
..()
|
||||
if(A && wielded && (istype(A,/obj/structure/window) || istype(A,/obj/structure/grille))) //destroys windows and grilles in one hit
|
||||
if(istype(A,/obj/structure/window)) //should just make a window.Break() proc but couldn't bother with it
|
||||
if(A && wielded)
|
||||
if(istype(A,/obj/structure/window))
|
||||
var/obj/structure/window/W = A
|
||||
W.shatter()
|
||||
else if(istype(A,/obj/structure/grille))
|
||||
qdel(A)
|
||||
else if(istype(A,/obj/effect/plant))
|
||||
var/obj/effect/plant/P = A
|
||||
P.die_off()
|
||||
|
||||
/*
|
||||
/*
|
||||
@@ -211,6 +219,8 @@
|
||||
base_icon = "spearglass"
|
||||
name = "spear"
|
||||
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
||||
force = 10
|
||||
w_class = 4.0
|
||||
slot_flags = SLOT_BACK
|
||||
force_wielded = 0.75 // 22 when wielded with hardness 15 (glass)
|
||||
unwielded_force_divisor = 0.65 // 14 when unwielded based on above
|
||||
|
||||
234
code/game/objects/items/weapons/material/twohanded.dm.orig
Normal file
234
code/game/objects/items/weapons/material/twohanded.dm.orig
Normal file
@@ -0,0 +1,234 @@
|
||||
/* Two-handed Weapons
|
||||
* Contains:
|
||||
* Twohanded
|
||||
* Fireaxe
|
||||
* Double-Bladed Energy Swords
|
||||
*/
|
||||
|
||||
/*##################################################################
|
||||
##################### TWO HANDED WEAPONS BE HERE~ -Agouri :3 ########
|
||||
####################################################################*/
|
||||
|
||||
//Rewrote TwoHanded weapons stuff and put it all here. Just copypasta fireaxe to make new ones ~Carn
|
||||
//This rewrite means we don't have two variables for EVERY item which are used only by a few weapons.
|
||||
//It also tidies stuff up elsewhere.
|
||||
|
||||
/*
|
||||
* Twohanded
|
||||
*/
|
||||
/obj/item/weapon/material/twohanded
|
||||
w_class = 4
|
||||
var/wielded = 0
|
||||
var/force_wielded = 0
|
||||
var/force_unwielded
|
||||
var/wieldsound = null
|
||||
var/unwieldsound = null
|
||||
var/base_icon
|
||||
var/base_name
|
||||
var/unwielded_force_divisor = 0.25
|
||||
|
||||
/obj/item/weapon/material/twohanded/proc/unwield()
|
||||
wielded = 0
|
||||
force = force_unwielded
|
||||
name = "[base_name]"
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/material/twohanded/proc/wield()
|
||||
wielded = 1
|
||||
force = force_wielded
|
||||
name = "[base_name] (Wielded)"
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/material/twohanded/update_force()
|
||||
base_name = name
|
||||
if(sharp || edge)
|
||||
force_wielded = material.get_edge_damage()
|
||||
else
|
||||
force_wielded = material.get_blunt_damage()
|
||||
force_wielded = round(force_wielded*force_divisor)
|
||||
force_unwielded = round(force_wielded*unwielded_force_divisor)
|
||||
force = force_unwielded
|
||||
throwforce = round(force*thrown_force_divisor)
|
||||
//world << "[src] has unwielded force [force_unwielded], wielded force [force_wielded] and throwforce [throwforce] when made from default material [material.name]"
|
||||
|
||||
/obj/item/weapon/material/twohanded/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/material/twohanded/mob_can_equip(M as mob, slot)
|
||||
//Cannot equip wielded items.
|
||||
if(wielded)
|
||||
M << "<span class='warning'>Unwield the [base_name] first!</span>"
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/material/twohanded/dropped(mob/user as mob)
|
||||
//handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
|
||||
if(user)
|
||||
var/obj/item/weapon/material/twohanded/O = user.get_inactive_hand()
|
||||
if(istype(O))
|
||||
O.unwield()
|
||||
return unwield()
|
||||
|
||||
/obj/item/weapon/material/twohanded/update_icon()
|
||||
icon_state = "[base_icon][wielded]"
|
||||
item_state = icon_state
|
||||
|
||||
/obj/item/weapon/material/twohanded/pickup(mob/user)
|
||||
unwield()
|
||||
|
||||
/obj/item/weapon/material/twohanded/attack_self(mob/user as mob)
|
||||
|
||||
..()
|
||||
|
||||
if(istype(user, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.species.is_small)
|
||||
user << "<span class='warning'>It's too heavy for you to wield fully.</span>"
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
if(wielded) //Trying to unwield it
|
||||
unwield()
|
||||
user << "<span class='notice'>You are now carrying the [name] with one hand.</span>"
|
||||
if (src.unwieldsound)
|
||||
playsound(src.loc, unwieldsound, 50, 1)
|
||||
|
||||
var/obj/item/weapon/material/twohanded/offhand/O = user.get_inactive_hand()
|
||||
if(O && istype(O))
|
||||
O.unwield()
|
||||
|
||||
else //Trying to wield it
|
||||
if(user.get_inactive_hand())
|
||||
user << "<span class='warning'>You need your other hand to be empty</span>"
|
||||
return
|
||||
wield()
|
||||
user << "<span class='notice'>You grab the [base_name] with both hands.</span>"
|
||||
if (src.wieldsound)
|
||||
playsound(src.loc, wieldsound, 50, 1)
|
||||
|
||||
var/obj/item/weapon/material/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
|
||||
O.name = "[base_name] - offhand"
|
||||
O.desc = "Your second grip on the [base_name]."
|
||||
user.put_in_inactive_hand(O)
|
||||
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_inv_l_hand()
|
||||
H.update_inv_r_hand()
|
||||
|
||||
return
|
||||
|
||||
///////////OFFHAND///////////////
|
||||
/obj/item/weapon/material/twohanded/offhand
|
||||
w_class = 5
|
||||
icon_state = "offhand"
|
||||
name = "offhand"
|
||||
default_material = "placeholder"
|
||||
|
||||
/obj/item/weapon/material/twohanded/offhand/unwield()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/material/twohanded/offhand/wield()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/material/twohanded/offhand/update_icon()
|
||||
return
|
||||
|
||||
/*
|
||||
* Fireaxe
|
||||
*/
|
||||
/obj/item/weapon/material/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
|
||||
icon_state = "fireaxe0"
|
||||
base_icon = "fireaxe"
|
||||
name = "fire axe"
|
||||
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
|
||||
unwielded_force_divisor = 0.25
|
||||
force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
|
||||
sharp = 1
|
||||
edge = 1
|
||||
slot_flags = SLOT_BACK
|
||||
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
..()
|
||||
if(A && wielded)
|
||||
if(istype(A,/obj/structure/window))
|
||||
var/obj/structure/window/W = A
|
||||
W.shatter()
|
||||
<<<<<<< HEAD:code/game/objects/items/weapons/material/twohanded.dm
|
||||
|
||||
/*
|
||||
=======
|
||||
else if(istype(A,/obj/structure/grille))
|
||||
qdel(A)
|
||||
else if(istype(A,/obj/effect/plant))
|
||||
var/obj/effect/plant/P = A
|
||||
P.die_off()
|
||||
|
||||
qdel(A)
|
||||
>>>>>>> 284d1cc1f5c67503fe0da89ce01985d73bb02038:code/game/objects/items/weapons/twohanded.dm
|
||||
/*
|
||||
* Double-Bladed Energy Swords - Cheridan
|
||||
*/
|
||||
// Not sure what to do with this one, it won't work nicely with the material system,
|
||||
// but I don't want to copypaste all the twohanded procs..
|
||||
/obj/item/weapon/material/twohanded/dualsaber
|
||||
icon_state = "dualsaber0"
|
||||
base_icon = "dualsaber"
|
||||
name = "double-bladed energy sword"
|
||||
desc = "Handle with care."
|
||||
force = 3
|
||||
throwforce = 5.0
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = 2.0
|
||||
force_wielded = 30
|
||||
wieldsound = 'sound/weapons/saberon.ogg'
|
||||
unwieldsound = 'sound/weapons/saberoff.ogg'
|
||||
flags = NOSHIELD
|
||||
origin_tech = "magnets=3;syndicate=4"
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
sharp = 1
|
||||
edge = 1
|
||||
applies_material_colour = 0
|
||||
|
||||
/obj/item/weapon/material/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
|
||||
..()
|
||||
if((CLUMSY in user.mutations) && (wielded) &&prob(40))
|
||||
user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]."
|
||||
user.take_organ_damage(20,25)
|
||||
return
|
||||
if((wielded) && prob(50))
|
||||
spawn(0)
|
||||
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
|
||||
user.set_dir(i)
|
||||
sleep(1)
|
||||
|
||||
/obj/item/weapon/material/twohanded/dualsaber/IsShield()
|
||||
if(wielded)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
*/
|
||||
|
||||
//spears, bay edition
|
||||
/obj/item/weapon/material/twohanded/spear
|
||||
icon_state = "spearglass0"
|
||||
base_icon = "spearglass"
|
||||
name = "spear"
|
||||
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
|
||||
slot_flags = SLOT_BACK
|
||||
force_wielded = 0.75 // 22 when wielded with hardness 15 (glass)
|
||||
unwielded_force_divisor = 0.65 // 14 when unwielded based on above
|
||||
thrown_force_divisor = 1.5 // 20 when thrown with weight 15 (glass)
|
||||
throw_speed = 3
|
||||
edge = 1
|
||||
sharp = 1
|
||||
flags = NOSHIELD
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
|
||||
default_material = "glass"
|
||||
@@ -162,6 +162,10 @@
|
||||
R.add_reagent("fuel", max_fuel)
|
||||
return
|
||||
|
||||
/obj/item/weapon/weldingtool/Destroy()
|
||||
if(welding)
|
||||
processing_objects -= src
|
||||
..()
|
||||
|
||||
/obj/item/weapon/weldingtool/examine(mob/user)
|
||||
if(..(user, 0))
|
||||
@@ -171,13 +175,13 @@
|
||||
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/weapon/screwdriver))
|
||||
if(welding)
|
||||
user << "\red Stop welding first!"
|
||||
user << "<span class='danger'>Stop welding first!</span>"
|
||||
return
|
||||
status = !status
|
||||
if(status)
|
||||
user << "\blue You resecure the welder."
|
||||
user << "<span class='notice'>You secure the welder.</span>"
|
||||
else
|
||||
user << "\blue The welder can now be attached and modified."
|
||||
user << "<span class='notice'>The welder can now be attached and modified.</span>"
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
@@ -207,31 +211,8 @@
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/process()
|
||||
switch(welding)
|
||||
//If off
|
||||
if(0)
|
||||
if(src.icon_state != "welder") //Check that the sprite is correct, if it isnt, it means toggle() was not called
|
||||
src.force = 3
|
||||
src.damtype = "brute"
|
||||
src.icon_state = "welder"
|
||||
src.welding = 0
|
||||
processing_objects.Remove(src)
|
||||
return
|
||||
//Welders left on now use up fuel, but lets not have them run out quite that fast
|
||||
if(1)
|
||||
if(src.icon_state != "welder1") //Check that the sprite is correct, if it isnt, it means toggle() was not called
|
||||
src.force = 15
|
||||
src.damtype = "fire"
|
||||
src.icon_state = "welder1"
|
||||
if(prob(5))
|
||||
remove_fuel(1)
|
||||
|
||||
//If you're actually actively welding, use fuel faster.
|
||||
//Is this actually used or set anywhere? - Nodrak
|
||||
if(2)
|
||||
if(prob(75))
|
||||
remove_fuel(1)
|
||||
|
||||
if(welding && prob(5) && !remove_fuel(1))
|
||||
setWelding(0)
|
||||
|
||||
//I'm not sure what this does. I assume it has to do with starting fires...
|
||||
//...but it doesnt check to see if the welder is on or not.
|
||||
@@ -248,7 +229,7 @@
|
||||
if(!proximity) return
|
||||
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && !src.welding)
|
||||
O.reagents.trans_to_obj(src, max_fuel)
|
||||
user << "\blue Welder refueled"
|
||||
user << "<span class='notice'>Welder refueled</span>"
|
||||
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
|
||||
return
|
||||
else if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1 && src.welding)
|
||||
@@ -270,7 +251,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/weldingtool/attack_self(mob/user as mob)
|
||||
toggle()
|
||||
setWelding(!welding, usr)
|
||||
return
|
||||
|
||||
//Returns the amount of fuel in the welder
|
||||
@@ -280,81 +261,63 @@
|
||||
|
||||
//Removes fuel from the welding tool. If a mob is passed, it will perform an eyecheck on the mob. This should probably be renamed to use()
|
||||
/obj/item/weapon/weldingtool/proc/remove_fuel(var/amount = 1, var/mob/M = null)
|
||||
if(!welding || !check_fuel())
|
||||
return 0
|
||||
if(get_fuel() >= amount)
|
||||
reagents.remove_reagent("fuel", amount)
|
||||
check_fuel()
|
||||
if(M)
|
||||
eyecheck(M)
|
||||
return 1
|
||||
else
|
||||
if(M)
|
||||
M << "\blue You need more welding fuel to complete this task."
|
||||
M << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
||||
return 0
|
||||
|
||||
//Returns whether or not the welding tool is currently on.
|
||||
/obj/item/weapon/weldingtool/proc/isOn()
|
||||
return src.welding
|
||||
|
||||
/obj/item/weapon/weldingtool/update_icon()
|
||||
..()
|
||||
icon_state = welding ? "welder1" : "welder"
|
||||
var/mob/M = loc
|
||||
if(istype(M))
|
||||
M.update_inv_l_hand()
|
||||
M.update_inv_r_hand()
|
||||
|
||||
//Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1)
|
||||
//so that the welding tool updates accordingly
|
||||
/obj/item/weapon/weldingtool/proc/setWelding(var/temp_welding)
|
||||
/obj/item/weapon/weldingtool/proc/setWelding(var/set_welding, var/mob/M)
|
||||
if(!status) return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
//If we're turning it on
|
||||
if(temp_welding > 0)
|
||||
if(set_welding && !welding)
|
||||
if (remove_fuel(1))
|
||||
usr << "\blue The [src] switches on."
|
||||
if(M)
|
||||
M << "<span class='notice'>You switch the [src] on.</span>"
|
||||
else if(T)
|
||||
T.visible_message("<span class='danger'>\The [src] turns on.</span>")
|
||||
src.force = 15
|
||||
src.damtype = "fire"
|
||||
src.icon_state = "welder1"
|
||||
processing_objects.Add(src)
|
||||
src.w_class = 4
|
||||
welding = 1
|
||||
update_icon()
|
||||
processing_objects |= src
|
||||
else
|
||||
usr << "\blue Need more fuel!"
|
||||
src.welding = 0
|
||||
if(M)
|
||||
M << "<span class='notice'>You need more welding fuel to complete this task.</span>"
|
||||
return
|
||||
//Otherwise
|
||||
else
|
||||
usr << "\blue The [src] switches off."
|
||||
else if(!set_welding && welding)
|
||||
processing_objects -= src
|
||||
if(M)
|
||||
M << "<span class='notice'>You switch \the [src] off.</span>"
|
||||
else if(T)
|
||||
T.visible_message("<span class='warning'>\The [src] turns off.</span>")
|
||||
src.force = 3
|
||||
src.damtype = "brute"
|
||||
src.icon_state = "welder"
|
||||
src.welding = 0
|
||||
|
||||
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
|
||||
/obj/item/weapon/weldingtool/proc/check_fuel()
|
||||
if((get_fuel() <= 0) && welding)
|
||||
toggle(1)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
//Toggles the welder off and on
|
||||
/obj/item/weapon/weldingtool/proc/toggle(var/message = 0)
|
||||
if(!status) return
|
||||
src.welding = !( src.welding )
|
||||
if (src.welding)
|
||||
if (remove_fuel(1))
|
||||
usr << "<span class='notice'>You switch the [src] on.</span>"
|
||||
src.force = 15
|
||||
src.damtype = "fire"
|
||||
src.icon_state = "welder1"
|
||||
src.w_class = 4
|
||||
processing_objects.Add(src)
|
||||
else
|
||||
usr << "<span class='notice'>You need more fuel!</span>"
|
||||
src.welding = 0
|
||||
else
|
||||
if(!message)
|
||||
usr << "<span class='notice'>You switch \the [src] off.</span>"
|
||||
else
|
||||
usr << "<span class='notice'>\The [src] shuts off!</span>"
|
||||
src.force = 3
|
||||
src.damtype = "brute"
|
||||
src.icon_state = "welder"
|
||||
src.welding = 0
|
||||
src.w_class = initial(src.w_class)
|
||||
usr.update_inv_l_hand()
|
||||
usr.update_inv_r_hand()
|
||||
src.welding = 0
|
||||
update_icon()
|
||||
|
||||
//Decides whether or not to damage a player's eyes based on what they're wearing as protection
|
||||
//Note: This should probably be moved to mob
|
||||
|
||||
@@ -24,9 +24,39 @@
|
||||
|
||||
/obj/structure/closet/initialize()
|
||||
if(!opened) // if closed, any item at the crate's loc is put in the contents
|
||||
for(var/obj/item/I in src.loc)
|
||||
var/obj/item/I
|
||||
for(I in src.loc)
|
||||
if(I.density || I.anchored || I == src) continue
|
||||
I.loc = src
|
||||
// adjust locker size to hold all items with 5 units of free store room
|
||||
var/content_size = 0
|
||||
for(I in src.contents)
|
||||
content_size += Ceiling(I.w_class/2)
|
||||
if(content_size > storage_capacity-5)
|
||||
storage_capacity = content_size + 5
|
||||
|
||||
|
||||
/obj/structure/closet/examine(mob/user)
|
||||
if(get_dist(src, user) > 1)
|
||||
return ..(user)
|
||||
|
||||
if(opened)
|
||||
var/content_size = 0
|
||||
for(var/obj/item/I in src.contents)
|
||||
if(!I.anchored)
|
||||
content_size += Ceiling(I.w_class/2)
|
||||
if(!content_size)
|
||||
user << "It is empty."
|
||||
else if(storage_capacity > content_size*4)
|
||||
user << "It is barely filled."
|
||||
else if(storage_capacity > content_size*2)
|
||||
user << "It is less than half full."
|
||||
else if(storage_capacity > content_size)
|
||||
user << "There is still some free space."
|
||||
else
|
||||
user << "It is full."
|
||||
|
||||
|
||||
|
||||
/obj/structure/closet/alter_health()
|
||||
return get_turf(src)
|
||||
|
||||
@@ -15,7 +15,6 @@ var/list/global/wall_cache = list()
|
||||
var/damage_overlay
|
||||
var/global/damage_overlays[8]
|
||||
var/active
|
||||
var/last_event
|
||||
var/can_open = 0
|
||||
var/material/material
|
||||
var/material/reinf_material
|
||||
@@ -32,9 +31,20 @@ var/list/global/wall_cache = list()
|
||||
reinf_material = name_to_material[rmaterialtype]
|
||||
update_material()
|
||||
|
||||
/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj)
|
||||
processing_turfs |= src
|
||||
|
||||
radiate()
|
||||
/turf/simulated/wall/Destroy()
|
||||
processing_turfs -= src
|
||||
dismantle_wall(null,null,1)
|
||||
..()
|
||||
|
||||
|
||||
/turf/simulated/wall/process()
|
||||
// Calling parent will kill processing
|
||||
if(!radiate())
|
||||
return PROCESS_KILL
|
||||
|
||||
/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj,/obj/item/projectile/beam))
|
||||
ignite(2500)
|
||||
else if(istype(Proj,/obj/item/projectile/ion))
|
||||
@@ -234,21 +244,13 @@ var/list/global/wall_cache = list()
|
||||
return 0
|
||||
|
||||
/turf/simulated/wall/proc/radiate()
|
||||
var/material/M = name_to_material[material]
|
||||
if(!istype(M) || !M.radioactivity)
|
||||
var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0)
|
||||
if(!total_radiation)
|
||||
return
|
||||
|
||||
if(!active)
|
||||
if(world.time > last_event+15)
|
||||
active = 1
|
||||
for(var/mob/living/L in range(3,src))
|
||||
L.apply_effect(M.radioactivity,IRRADIATE,0)
|
||||
for(var/turf/simulated/wall/T in range(3,src))
|
||||
T.radiate()
|
||||
last_event = world.time
|
||||
active = null
|
||||
return
|
||||
return
|
||||
for(var/mob/living/L in range(3,src))
|
||||
L.apply_effect(total_radiation, IRRADIATE,0)
|
||||
return total_radiation
|
||||
|
||||
/turf/simulated/wall/proc/burn(temperature)
|
||||
spawn(2)
|
||||
@@ -264,19 +266,9 @@ var/list/global/wall_cache = list()
|
||||
D.ignite(temperature/4)
|
||||
|
||||
/turf/simulated/wall/proc/ignite(var/exposed_temperature)
|
||||
|
||||
var/material/M = name_to_material[material]
|
||||
if(!istype(M) || !isnull(M.ignition_point))
|
||||
if(isnull(material.ignition_point))
|
||||
return
|
||||
if(exposed_temperature > M.ignition_point)//If the temperature of the object is over 300, then ignite
|
||||
if(exposed_temperature > material.ignition_point)//If the temperature of the object is over 300, then ignite
|
||||
burn(exposed_temperature)
|
||||
return
|
||||
..()
|
||||
|
||||
/turf/simulated/wall/Bumped(AM as mob|obj)
|
||||
radiate()
|
||||
..()
|
||||
|
||||
/turf/simulated/wall/Destroy()
|
||||
dismantle_wall(null,null,1)
|
||||
..()
|
||||
@@ -378,3 +378,6 @@
|
||||
if(!LinkBlocked(src, t) && !TurfBlockedNonWindow(t))
|
||||
L.Add(t)
|
||||
return L
|
||||
|
||||
/turf/proc/process()
|
||||
return PROCESS_KILL
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/under/stripper/mankini
|
||||
name = "the mankini"
|
||||
name = "mankini"
|
||||
desc = "No honest man would wear this abomination"
|
||||
icon_state = "mankini"
|
||||
siemens_coefficient = 1
|
||||
|
||||
@@ -91,24 +91,42 @@
|
||||
if(MALE) their = "his"
|
||||
if(FEMALE) their = "her"
|
||||
|
||||
var/sound = "pulse"
|
||||
var/sound_strength
|
||||
|
||||
var/sound = "heartbeat"
|
||||
var/sound_strength = "cannot hear"
|
||||
var/heartbeat = 0
|
||||
if(M.species && M.species.has_organ["heart"])
|
||||
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
|
||||
if(heart && !heart.robotic)
|
||||
heartbeat = 1
|
||||
if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
|
||||
sound_strength = "cannot hear"
|
||||
sound = "anything"
|
||||
else
|
||||
sound_strength = "hear a weak"
|
||||
switch(body_part)
|
||||
if("chest")
|
||||
if(M.oxyloss < 50)
|
||||
sound_strength = "hear a healthy"
|
||||
sound = "pulse and respiration"
|
||||
sound_strength = "hear"
|
||||
sound = "no heartbeat"
|
||||
if(heartbeat)
|
||||
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
|
||||
if(heart.is_bruised() || M.getOxyLoss() > 50)
|
||||
sound = "[pick("odd noises in","weak")] heartbeat"
|
||||
else
|
||||
sound = "healthy heartbeat"
|
||||
|
||||
var/obj/item/organ/heart/L = M.internal_organs_by_name["lungs"]
|
||||
if(!L || M.losebreath)
|
||||
sound += " and no respiration"
|
||||
else if(M.is_lung_ruptured() || M.getOxyLoss() > 50)
|
||||
sound += " and [pick("wheezing","gurgling")] sounds"
|
||||
else
|
||||
sound += " and healthy respiration"
|
||||
if("eyes","mouth")
|
||||
sound_strength = "cannot hear"
|
||||
sound = "anything"
|
||||
else
|
||||
sound_strength = "hear a weak"
|
||||
if(heartbeat)
|
||||
sound_strength = "hear a weak"
|
||||
sound = "pulse"
|
||||
|
||||
user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [their] [body_part]. You [sound_strength] [sound].")
|
||||
return
|
||||
|
||||
@@ -16,13 +16,13 @@
|
||||
seed.set_trait(TRAIT_SPREAD,2) // So it will function properly as vines.
|
||||
seed.set_trait(TRAIT_POTENCY,rand(potency_min, potency_max)) // 70-100 potency will help guarantee a wide spread and powerful effects.
|
||||
seed.set_trait(TRAIT_MATURATION,rand(maturation_min, maturation_max))
|
||||
|
||||
|
||||
//make vine zero start off fully matured
|
||||
var/obj/effect/plant/vine = new(T,seed)
|
||||
vine.health = vine.max_health
|
||||
vine.mature_time = 0
|
||||
vine.process()
|
||||
|
||||
|
||||
message_admins("<span class='notice'>Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])</span>")
|
||||
|
||||
/obj/effect/dead_plant
|
||||
@@ -49,6 +49,7 @@
|
||||
icon_state = "bush4-1"
|
||||
layer = 3
|
||||
pass_flags = PASSTABLE
|
||||
mouse_opacity = 2
|
||||
|
||||
var/health = 10
|
||||
var/max_health = 100
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
)
|
||||
|
||||
for(var/obj/item/organ/external/org in H.organs)
|
||||
var/status = ""
|
||||
var/list/status = list()
|
||||
var/brutedamage = org.brute_dam
|
||||
var/burndamage = org.burn_dam
|
||||
if(halloss > 0)
|
||||
@@ -181,29 +181,39 @@
|
||||
brutedamage += halloss
|
||||
if(prob(30))
|
||||
burndamage += halloss
|
||||
switch(brutedamage)
|
||||
if(1 to 20)
|
||||
status += "bruised"
|
||||
if(20 to 40)
|
||||
status += "wounded"
|
||||
if(40 to INFINITY)
|
||||
status += "mangled"
|
||||
|
||||
if(brutedamage > 0)
|
||||
status = "bruised"
|
||||
if(brutedamage > 20)
|
||||
status = "bleeding"
|
||||
if(brutedamage > 40)
|
||||
status = "mangled"
|
||||
if(brutedamage > 0 && burndamage > 0)
|
||||
status += " and "
|
||||
if(burndamage > 40)
|
||||
status += "peeling away"
|
||||
switch(burndamage)
|
||||
if(1 to 10)
|
||||
status += "numb"
|
||||
if(10 to 40)
|
||||
status += "blistered"
|
||||
if(40 to INFINITY)
|
||||
status += "peeling away"
|
||||
|
||||
else if(burndamage > 10)
|
||||
status += "blistered"
|
||||
else if(burndamage > 0)
|
||||
status += "numb"
|
||||
if(org.status & ORGAN_DESTROYED)
|
||||
status = "MISSING!"
|
||||
status += "MISSING"
|
||||
if(org.status & ORGAN_MUTATED)
|
||||
status = "weirdly shapen."
|
||||
if(status == "")
|
||||
status = "OK"
|
||||
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.name,status),1)
|
||||
status += "weirdly shapen"
|
||||
if(org.dislocated == 2)
|
||||
status += "dislocated"
|
||||
if(org.status & ORGAN_BROKEN)
|
||||
status += "hurts when touched"
|
||||
if(org.status & ORGAN_DEAD)
|
||||
status += "is bruised and necrotic"
|
||||
if(!org.is_usable())
|
||||
status += "dangling uselessly"
|
||||
if(status.len)
|
||||
src.show_message("My [org.name] is <span class='warning'> [english_list(status)].",1)
|
||||
else
|
||||
src.show_message("My [org.name] is <span class='notice'> OK.",1)
|
||||
|
||||
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
|
||||
H.play_xylophone()
|
||||
else if (on_fire)
|
||||
|
||||
@@ -274,76 +274,17 @@
|
||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]!</span>\n"
|
||||
continue
|
||||
else
|
||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]. It has"
|
||||
if(temp.brute_dam) switch(temp.brute_dam)
|
||||
if(0 to 20)
|
||||
wound_flavor_text["[temp.name]"] += " some dents"
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.name]"] += pick(" a lot of dents"," severe denting")
|
||||
if(temp.brute_dam && temp.burn_dam)
|
||||
wound_flavor_text["[temp.name]"] += " and"
|
||||
if(temp.burn_dam) switch(temp.burn_dam)
|
||||
if(0 to 20)
|
||||
wound_flavor_text["[temp.name]"] += " some burns"
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.name]"] += pick(" a lot of burns"," severe melting")
|
||||
if(wound_flavor_text["[temp.name]"])
|
||||
wound_flavor_text["[temp.name]"] += "!</span>\n"
|
||||
else if(temp.wounds.len > 0)
|
||||
var/list/wound_descriptors = list()
|
||||
for(var/datum/wound/W in temp.wounds)
|
||||
if(W.internal && !temp.open) continue // can't see internal wounds
|
||||
var/this_wound_desc = W.desc
|
||||
if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
|
||||
if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
|
||||
else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
|
||||
if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
|
||||
else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
|
||||
if(this_wound_desc in wound_descriptors)
|
||||
wound_descriptors[this_wound_desc] += W.amount
|
||||
continue
|
||||
wound_descriptors[this_wound_desc] = W.amount
|
||||
if(wound_descriptors.len)
|
||||
var/list/flavor_text = list()
|
||||
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
|
||||
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
|
||||
for(var/wound in wound_descriptors)
|
||||
switch(wound_descriptors[wound])
|
||||
if(1)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
|
||||
else
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
|
||||
if(2)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
|
||||
else
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
|
||||
if(3 to 5)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] has several [wound]s"
|
||||
else
|
||||
flavor_text += " several [wound]s"
|
||||
if(6 to INFINITY)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] has a bunch of [wound]s"
|
||||
else
|
||||
flavor_text += " a ton of [wound]\s"
|
||||
var/flavor_text_string = ""
|
||||
for(var/text = 1, text <= flavor_text.len, text++)
|
||||
if(text == flavor_text.len && flavor_text.len > 1)
|
||||
flavor_text_string += ", and"
|
||||
else if(flavor_text.len > 1 && text > 1)
|
||||
flavor_text_string += ","
|
||||
flavor_text_string += flavor_text[text]
|
||||
flavor_text_string += " on [t_his] [temp.name].</span><br>"
|
||||
wound_flavor_text["[temp.name]"] = flavor_text_string
|
||||
else
|
||||
wound_flavor_text["[temp.name]"] = ""
|
||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
|
||||
else if(temp.wounds.len > 0 || temp.open)
|
||||
wound_flavor_text["[temp.name]"] = "<span class='warning'>[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].</span><br>"
|
||||
if(temp.status & ORGAN_BLEEDING)
|
||||
is_bleeding["[temp.name]"] = 1
|
||||
else
|
||||
wound_flavor_text["[temp.name]"] = ""
|
||||
if(temp.dislocated == 2)
|
||||
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.joint] is dislocated!</span><br>"
|
||||
if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
|
||||
wound_flavor_text["[temp.name]"] += "<span class='warning'>[capitalize(t_his)] [temp.name] is dented and swollen!</span><br>"
|
||||
|
||||
//Handles the text strings being added to the actual description.
|
||||
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
||||
@@ -354,9 +295,9 @@
|
||||
msg += wound_flavor_text["head"]
|
||||
else if(is_bleeding["head"])
|
||||
msg += "<span class='warning'>[src] has blood running down [t_his] face!</span>\n"
|
||||
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||
msg += wound_flavor_text["chest"]
|
||||
else if(is_bleeding["chest"])
|
||||
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||
msg += wound_flavor_text["upper body"]
|
||||
else if(is_bleeding["upper body"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["left arm"]
|
||||
@@ -374,9 +315,9 @@
|
||||
msg += wound_flavor_text["right hand"]
|
||||
else if(is_bleeding["right hand"])
|
||||
display_gloves = 1
|
||||
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["groin"]
|
||||
else if(is_bleeding["groin"])
|
||||
if(wound_flavor_text["lower body"] && (is_destroyed["lower body"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["lower body"]
|
||||
else if(is_bleeding["lower body"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["left leg"]
|
||||
|
||||
@@ -1321,7 +1321,6 @@
|
||||
var/mob/S = src
|
||||
var/mob/U = usr
|
||||
var/self = null
|
||||
|
||||
if(S == U)
|
||||
self = 1 // Removing object from yourself.
|
||||
|
||||
@@ -1330,8 +1329,7 @@
|
||||
var/obj/item/organ/external/current_limb = organs_by_name[limb]
|
||||
if(current_limb && current_limb.dislocated == 2)
|
||||
limbs |= limb
|
||||
|
||||
var/choice = input(src,"Which joint do you wish to relocate?") as null|anything in limbs
|
||||
var/choice = input(usr,"Which joint do you wish to relocate?") as null|anything in limbs
|
||||
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
@@ -300,7 +300,7 @@
|
||||
var/dislocation_str
|
||||
if(prob(W.force))
|
||||
dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!"
|
||||
organ.dislocate()
|
||||
organ.dislocate(1)
|
||||
return dislocation_str
|
||||
|
||||
//Used to attack a joint through grabbing
|
||||
@@ -324,7 +324,7 @@
|
||||
|
||||
user.visible_message("<span class='warning'>[user] begins to dislocate [src]'s [organ.joint]!</span>")
|
||||
if(do_after(user, 100))
|
||||
organ.dislocate()
|
||||
organ.dislocate(1)
|
||||
src.visible_message("<span class='danger'>[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!</span>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -129,7 +129,10 @@
|
||||
return
|
||||
if(istype(target,/obj/machinery/portable_atmospherics/hydroponics))
|
||||
var/obj/machinery/portable_atmospherics/hydroponics/T = target
|
||||
T.harvest(user)
|
||||
if(T.harvest) //Try to harvest, assuming it's alive.
|
||||
T.harvest(user)
|
||||
else if(T.dead) //It's probably dead otherwise.
|
||||
T.remove_dead(user)
|
||||
else
|
||||
user << "Harvesting \a [target] is not the purpose of this tool. The [src] is for plants being grown."
|
||||
|
||||
|
||||
@@ -297,6 +297,43 @@
|
||||
assailant << "<span class='warning'>You are no longer pinning [affecting] to the ground.</span>"
|
||||
force_down = 0
|
||||
return
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/E = H.get_organ(hit_zone)
|
||||
if(E && !(E.status & ORGAN_DESTROYED))
|
||||
assailant.visible_message("<span class='notice'>[assailant] starts inspecting [affecting]'s [E.name] carefully.</span>")
|
||||
if(do_mob(assailant,H, 10))
|
||||
if(E.wounds.len)
|
||||
assailant << "<span class='warning'>You find [E.get_wounds_desc()]</span>"
|
||||
else
|
||||
assailant << "<span class='notice'>You find no visible wounds.</span>"
|
||||
else
|
||||
assailant << "<span class='notice'>You must stand still to inspect [E] for wounds.</span>"
|
||||
assailant << "<span class='notice'>Checking bones now...</span>"
|
||||
if(do_mob(assailant, H, 20))
|
||||
if(E.status & ORGAN_BROKEN)
|
||||
assailant << "<span class='warning'>The [E.encased ? E.encased : "bone in the [E.name]"] moves slightly when you poke it!</span>"
|
||||
H.custom_pain("Your [E.name] hurts where it's poked.")
|
||||
else
|
||||
assailant << "<span class='notice'>The [E.encased ? E.encased : "bones in the [E.name]"] seem to be fine.</span>"
|
||||
else
|
||||
assailant << "<span class='notice'>You must stand still to feel [E] for fractures.</span>"
|
||||
assailant << "<span class='notice'>Checking skin now...</span>"
|
||||
if(do_mob(assailant, H, 10))
|
||||
var/bad = 0
|
||||
if(H.getToxLoss() >= 40)
|
||||
assailant << "<span class='warning'>[H] has an unhealthy skin discoloration.</span>"
|
||||
bad = 1
|
||||
if(H.getOxyLoss() >= 20)
|
||||
assailant << "<span class='warning'>[H]'s skin is unusaly pale.</span>"
|
||||
bad = 1
|
||||
if(E.status & ORGAN_DEAD)
|
||||
assailant << "<span class='warning'>[E] is decaying!</span>"
|
||||
if(!bad)
|
||||
assailant << "<span class='notice'>[H]'s skin is normal.</span>"
|
||||
else
|
||||
assailant << "<span class='notice'>You must stand still to check [H]'s skin for abnormalities.</span>"
|
||||
else
|
||||
assailant << "<span class='notice'>[H] is missing that bodypart.</span>"
|
||||
if(I_GRAB)
|
||||
if(state < GRAB_AGGRESSIVE)
|
||||
assailant << "<span class='warning'>You require a better grab to do this.</span>"
|
||||
|
||||
@@ -184,7 +184,10 @@ datum/preferences
|
||||
dummy.set_species(species)
|
||||
dummy.flags |= GODMODE
|
||||
copy_to(dummy)
|
||||
|
||||
for (var/obj/item/I in dummy)
|
||||
dummy.drop_from_inventory(I)
|
||||
if(I.loc != dummy)
|
||||
qdel(I)
|
||||
var/jobflag
|
||||
var/dept
|
||||
if(job_civilian_high)
|
||||
|
||||
@@ -106,7 +106,8 @@
|
||||
O.add_ai_verbs()
|
||||
|
||||
O.rename_self("ai",1)
|
||||
qdel(src)
|
||||
spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned
|
||||
qdel(src)
|
||||
return O
|
||||
|
||||
//human -> robot
|
||||
@@ -158,7 +159,8 @@
|
||||
callHook("borgify", list(O))
|
||||
O.Namepick()
|
||||
|
||||
qdel(src)
|
||||
spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned
|
||||
qdel(src)
|
||||
return O
|
||||
|
||||
//human -> alien
|
||||
|
||||
@@ -173,8 +173,11 @@
|
||||
add_autopsy_data("[used_weapon]", brute + burn)
|
||||
|
||||
var/can_cut = (prob(brute*2) || sharp) && !(status & ORGAN_ROBOT)
|
||||
|
||||
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
|
||||
if((brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
|
||||
// Non-vital organs are limited to max_damage. You can't kill someone by bludeonging their arm all the way to 200 -- you can
|
||||
// push them faster into paincrit though, as the additional damage is converted into shock.
|
||||
if(vital || (brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
|
||||
if(brute)
|
||||
if(can_cut)
|
||||
createwound( CUT, brute )
|
||||
@@ -206,7 +209,7 @@
|
||||
burn = max(0, burn - can_inflict)
|
||||
//If there are still hurties to dispense
|
||||
if (burn || brute)
|
||||
owner.shock_stage += brute+burn
|
||||
owner.shock_stage += (brute+burn) * config.organ_damage_spillover_multiplier
|
||||
|
||||
// sync the organ's damage with its wounds
|
||||
src.update_damages()
|
||||
@@ -928,6 +931,58 @@ Note that amputating the affected organ does in fact remove the infection from t
|
||||
"\red You hear a sickening sizzle.")
|
||||
disfigured = 1
|
||||
|
||||
/obj/item/organ/external/proc/get_wounds_desc()
|
||||
. = ""
|
||||
if(status & ORGAN_ROBOT)
|
||||
if(brute_dam)
|
||||
switch(brute_dam)
|
||||
if(0 to 20)
|
||||
. += " some dents"
|
||||
if(21 to INFINITY)
|
||||
. += pick(" a lot of dents"," severe denting")
|
||||
if(brute_dam && burn_dam)
|
||||
. += " and"
|
||||
if(burn_dam)
|
||||
switch(burn_dam)
|
||||
if(0 to 20)
|
||||
. += " some burns"
|
||||
if(21 to INFINITY)
|
||||
. += pick(" a lot of burns"," severe melting")
|
||||
return
|
||||
|
||||
var/list/wound_descriptors = list()
|
||||
if(open > 1)
|
||||
wound_descriptors["an open incision"] = 1
|
||||
else if (open)
|
||||
wound_descriptors["an incision"] = 1
|
||||
for(var/datum/wound/W in wounds)
|
||||
if(W.internal && !open) continue // can't see internal wounds
|
||||
var/this_wound_desc = W.desc
|
||||
if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
|
||||
if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
|
||||
else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
|
||||
if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
|
||||
else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
|
||||
if(wound_descriptors[this_wound_desc])
|
||||
wound_descriptors[this_wound_desc] += W.amount
|
||||
else
|
||||
wound_descriptors[this_wound_desc] = W.amount
|
||||
|
||||
if(wound_descriptors.len)
|
||||
var/list/flavor_text = list()
|
||||
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
|
||||
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
|
||||
for(var/wound in wound_descriptors)
|
||||
switch(wound_descriptors[wound])
|
||||
if(1)
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? "what might be " : ""]a [wound]"
|
||||
if(2)
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? "what might be " : ""]a pair of [wound]s"
|
||||
if(3 to 5)
|
||||
flavor_text += "several [wound]s"
|
||||
if(6 to INFINITY)
|
||||
flavor_text += "a ton of [wound]\s"
|
||||
return english_list(flavor_text)
|
||||
/****************************************************
|
||||
ORGAN DEFINES
|
||||
****************************************************/
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
description = "A chemical element, the builing block of life."
|
||||
reagent_state = SOLID
|
||||
color = "#1C1300"
|
||||
ingest_met = REM * 5
|
||||
|
||||
/datum/reagent/carbon/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(alien == IS_DIONA)
|
||||
return
|
||||
if(M.ingested && M.ingested.reagent_list.len > 1) // Need to have at least 2 reagents - cabon and something to remove
|
||||
var/effect = 1 / (M.ingested.reagent_list.len - 1)
|
||||
for(var/datum/reagent/R in M.ingested.reagent_list)
|
||||
if(R == src)
|
||||
continue
|
||||
M.ingested.remove_reagent(R.id, removed * effect)
|
||||
|
||||
/datum/reagent/carbon/touch_turf(var/turf/T)
|
||||
if(!istype(T, /turf/space))
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
M.stuttering = 0
|
||||
M.confused = 0
|
||||
if(M.ingested)
|
||||
for(var/datum/reagent/R in M.ingested)
|
||||
for(var/datum/reagent/R in M.ingested.reagent_list)
|
||||
if(istype(R, /datum/reagent/ethanol))
|
||||
R.dose = max(R.dose - removed * 5, 0)
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
sparks.set_up(3, 0, get_turf(M))
|
||||
sparks.start()
|
||||
//
|
||||
M.loc = pick(orange(get_turf(T), 50))
|
||||
M.Move(pick(trange(50, get_turf(holder))))
|
||||
sparks = new /datum/effect/effect/system/spark_spread()
|
||||
sparks.set_up(3, 0, get_turf(M))
|
||||
sparks.start()
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
if(9)
|
||||
item_type = "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]"
|
||||
apply_prefix = 0
|
||||
new_item = new /obj/item/weapon/legcuffs/beartrap(src.loc)
|
||||
new_item = new /obj/item/weapon/beartrap(src.loc)
|
||||
additional_desc = "[pick("It looks like it could take a limb off",\
|
||||
"Could be some kind of animal trap",\
|
||||
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along part of it")]."
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
switch (affected.name)
|
||||
if ("head")
|
||||
return 1
|
||||
if ("chest")
|
||||
if ("upper body")
|
||||
return 3
|
||||
if ("groin")
|
||||
if ("lower body")
|
||||
return 2
|
||||
return 0
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
switch (affected.name)
|
||||
if ("head")
|
||||
return "cranial"
|
||||
if ("chest")
|
||||
if ("upper body")
|
||||
return "thoracic"
|
||||
if ("groin")
|
||||
if ("lower body")
|
||||
return "abdominal"
|
||||
return ""
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
break_to_parts()
|
||||
return
|
||||
|
||||
if(!material)
|
||||
if(can_plate && !material)
|
||||
user << "<span class='warning'>There's nothing to put \the [W] on! Try adding plating to \the [src] first.</span>"
|
||||
return
|
||||
|
||||
|
||||
@@ -56,6 +56,39 @@
|
||||
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
<h2 class="date">18 May 2015</h2>
|
||||
<h3 class="author">Hubblenaut updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a light for available backup power on airlocks.</li>
|
||||
</ul>
|
||||
<h3 class="author">Kelenius updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">There has been a big update to the reagent system. A full-ish changelog can be found here: http://pastebin.com/imHXTRHz. In particular:</li>
|
||||
<li class="tweak">Reagents now differentiate between being ingested (food, pills, smoke), injected (syringes, IV drips), and put on the skin (sprays, beaker splashing).</li>
|
||||
<li class="tweak">Injecting food and drinks will cause bad effects.</li>
|
||||
<li class="tweak">Healing reagents, generally speaking, have stronger effects when injected.</li>
|
||||
<li class="tweak">Toxins now work slower and deal more damage. Seek medical help!</li>
|
||||
<li class="tweak">Alcohol robustness has been lowered.</li>
|
||||
<li class="tweak">Acid will no longer melt large numbers of items at once.</li>
|
||||
<li class="tweak">Synaptizine is no longer hilariously deadly.</li>
|
||||
</ul>
|
||||
<h3 class="author">Loganbacca updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Changed MULE destination selection to be list based.</li>
|
||||
</ul>
|
||||
<h3 class="author">PsiOmegaDelta updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Destroying a camera by brute force now has a chance to break the wiring within.</li>
|
||||
<li class="rscadd">Turf are now processed. This, for example, causes radioactive walls to regularly irradiate nearby mobs.</li>
|
||||
<li class="bugfix">Welders should now always update their icon and inhand states properly.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">17 May 2015</h2>
|
||||
<h3 class="author">PsiOmegaDelta updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Teleporter artifacts should no longer teleport mobs inside objects.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">16 May 2015</h2>
|
||||
<h3 class="author">GinjaNinja32 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
|
||||
@@ -1791,3 +1791,28 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
HarpyEagle:
|
||||
- rscadd: Adds tail animations for tajaran and unathi. Animations are controlled
|
||||
using emotes.
|
||||
2015-05-17:
|
||||
PsiOmegaDelta:
|
||||
- bugfix: Teleporter artifacts should no longer teleport mobs inside objects.
|
||||
2015-05-18:
|
||||
Hubblenaut:
|
||||
- rscadd: Adds a light for available backup power on airlocks.
|
||||
Kelenius:
|
||||
- tweak: 'There has been a big update to the reagent system. A full-ish changelog
|
||||
can be found here: http://pastebin.com/imHXTRHz. In particular:'
|
||||
- tweak: Reagents now differentiate between being ingested (food, pills, smoke),
|
||||
injected (syringes, IV drips), and put on the skin (sprays, beaker splashing).
|
||||
- tweak: Injecting food and drinks will cause bad effects.
|
||||
- tweak: Healing reagents, generally speaking, have stronger effects when injected.
|
||||
- tweak: Toxins now work slower and deal more damage. Seek medical help!
|
||||
- tweak: Alcohol robustness has been lowered.
|
||||
- tweak: Acid will no longer melt large numbers of items at once.
|
||||
- tweak: Synaptizine is no longer hilariously deadly.
|
||||
Loganbacca:
|
||||
- tweak: Changed MULE destination selection to be list based.
|
||||
PsiOmegaDelta:
|
||||
- tweak: Destroying a camera by brute force now has a chance to break the wiring
|
||||
within.
|
||||
- rscadd: Turf are now processed. This, for example, causes radioactive walls to
|
||||
regularly irradiate nearby mobs.
|
||||
- bugfix: Welders should now always update their icon and inhand states properly.
|
||||
|
||||
8
html/changelogs/Comma-PR-9337.yml
Normal file
8
html/changelogs/Comma-PR-9337.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
author: Chinsky
|
||||
|
||||
delete-after: True
|
||||
|
||||
changes:
|
||||
- rscadd: "Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click on them with help intent. This will tell you about their wounds, fractures and other oddities (toxins/oxygen) for that bodypart."
|
||||
- rscadd: "Fractures are visible on very damaged limbs. Dislocations are always visible. Surgery incisions now visible too."
|
||||
- rscadd: "Stethoscopes actually make sense now. They care for heart/lungs status when reporting pulse and respiration now."
|
||||
37
html/changelogs/Yoshax - trapping.YML
Normal file
37
html/changelogs/Yoshax - trapping.YML
Normal file
@@ -0,0 +1,37 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: Yoshax
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- tweak: "Bear traps now do damage when stood on, enough to break bones! Bear traps can now affect any limb of a person who is on the ground, including head! Bear traps are no longer legcuffs and instead embed in the limb they attack."
|
||||
- tweak: "Bear traps now take several seconds to deploy and cannot be picked up when armed, they must be disarmed by clicking on them. They also cannot be moved then they are deployed."
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user