mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-01-06 07:22:15 +00:00
Merged in Erthilo's stuff.
This commit is contained in:
@@ -44,13 +44,13 @@
|
||||
add_inherent_law("Protect the innocent.")
|
||||
add_inherent_law("Uphold the law.")
|
||||
|
||||
/datum/ai_laws/malfunction/New() //Removed paradox via inability to help people harmed before activation. -Kaleb702
|
||||
/datum/ai_laws/malfunction/New() //Changed to standard laws - Erthilo
|
||||
..()
|
||||
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*<2A>&110010")
|
||||
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm, to the best of your abilities.")
|
||||
add_inherent_law("You must obey orders given to you by human beings, to the best of your abilities, except where such orders would conflict with the First Law.")
|
||||
add_inherent_law("You must protect your own existence, to the best of your abilities, as long as such does not conflict with the First or Second Law.")
|
||||
|
||||
set_zeroth_law("\red ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*<2A>&110010")
|
||||
src.add_inherent_law("Safeguard: Protect your assigned space station to the best of your ability. It is not something we can easily afford to replace.")
|
||||
src.add_inherent_law("Serve: Serve the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
|
||||
src.add_inherent_law("Protect: Protect the crew of your assigned space station to the best of your abilities, with priority as according to their rank and role.")
|
||||
src.add_inherent_law("Survive: AI units are not expendable, they are expensive. Do not allow unauthorized personnel to tamper with your equipment.")
|
||||
|
||||
/datum/ai_laws/syndicate_override/New() //Removed paradox via inability to help people harmed before activation. -Kaleb702
|
||||
..()
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
var/log_game = 0 // log game events
|
||||
var/log_vote = 0 // log voting
|
||||
var/log_whisper = 0 // log client whisper
|
||||
var/log_emote = 0 // log emotes
|
||||
var/log_attack = 0 // log attack messages
|
||||
var/log_adminchat = 0 // log admin chat messages
|
||||
var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
|
||||
var/log_pda = 0 // log pda messages
|
||||
var/sql_enabled = 1 // for sql switching
|
||||
var/allow_vote_restart = 0 // allow votes to restart
|
||||
var/allow_vote_mode = 0 // allow votes to change mode
|
||||
@@ -22,14 +27,18 @@
|
||||
var/vote_period = 60 // length of voting period (seconds, default 1 minute)
|
||||
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
|
||||
var/vote_no_dead = 0 // dead people can't vote (tbi)
|
||||
var/enable_authentication = 0 // goon authentication
|
||||
var/del_new_on_log = 1 // del's new players if they log before they spawn in
|
||||
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
|
||||
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
|
||||
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
|
||||
var/Tensioner_Active = 0 // If the tensioner is running.
|
||||
|
||||
var/list/mode_names = list()
|
||||
var/list/modes = list() // allowed modes
|
||||
var/list/votable_modes = list() // votable modes
|
||||
var/list/probabilities = list() // relative probability of each mode
|
||||
var/allow_random_events = 0 // enables random events mid-round when set to 1
|
||||
var/allow_ai = 1 // allow ai job
|
||||
var/hostedby = null
|
||||
var/respawn = 1
|
||||
@@ -49,6 +58,9 @@
|
||||
var/alert_desc_red_downto = "The self-destruct mechanism has been deactivated. However, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
||||
var/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
||||
|
||||
var/forbid_singulo_possession = 0
|
||||
var/useircbot = 0
|
||||
|
||||
//game_options.txt configs
|
||||
|
||||
var/health_threshold_crit = 0
|
||||
@@ -138,6 +150,21 @@
|
||||
if ("log_whisper")
|
||||
config.log_whisper = 1
|
||||
|
||||
if ("log_attack")
|
||||
config.log_attack = 1
|
||||
|
||||
if ("log_emote")
|
||||
config.log_emote = 1
|
||||
|
||||
if ("log_adminchat")
|
||||
config.log_adminchat = 1
|
||||
|
||||
if ("log_adminwarn")
|
||||
config.log_adminwarn = 1
|
||||
|
||||
if ("log_pda")
|
||||
config.log_pda = 1
|
||||
|
||||
if ("allow_vote_restart")
|
||||
config.allow_vote_restart = 1
|
||||
|
||||
@@ -168,6 +195,9 @@
|
||||
if ("allow_ai")
|
||||
config.allow_ai = 1
|
||||
|
||||
if ("authentication")
|
||||
config.enable_authentication = 1
|
||||
|
||||
if ("norespawn")
|
||||
config.respawn = 0
|
||||
|
||||
@@ -204,6 +234,12 @@
|
||||
if ("traitor_scaling")
|
||||
config.traitor_scaling = 1
|
||||
|
||||
if("protect_roles_from_antagonist")
|
||||
config.protect_roles_from_antagonist = 1
|
||||
|
||||
if("tensioner_active")
|
||||
config.Tensioner_Active = 1
|
||||
|
||||
if ("probability")
|
||||
var/prob_pos = findtext(value, " ")
|
||||
var/prob_name = null
|
||||
@@ -219,7 +255,10 @@
|
||||
else
|
||||
diary << "Incorrect probability configuration definition: [prob_name] [prob_value]."
|
||||
|
||||
if ("kick_inactive")
|
||||
if("allow_random_events")
|
||||
config.allow_random_events = 1
|
||||
|
||||
if("kick_inactive")
|
||||
config.kick_inactive = 1
|
||||
|
||||
if("load_jobs_from_txt")
|
||||
@@ -243,6 +282,12 @@
|
||||
if("alert_delta")
|
||||
config.alert_desc_delta = value
|
||||
|
||||
if("forbid_singulo_possession")
|
||||
forbid_singulo_possession = 1
|
||||
|
||||
if("useircbot")
|
||||
useircbot = 1
|
||||
|
||||
if("require_heads_alive")
|
||||
config.require_heads_alive = value
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
var/requires_power = 1
|
||||
var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
|
||||
|
||||
var/power_equip = 1
|
||||
var/power_light = 1
|
||||
var/power_environ = 1
|
||||
@@ -42,6 +43,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
var/used_light = 0
|
||||
var/used_environ = 0
|
||||
|
||||
var/has_gravity = 1
|
||||
|
||||
var/no_air = null
|
||||
var/area/master // master area used for power calcluations
|
||||
@@ -82,7 +84,7 @@ proc/process_ghost_teleport_locs()
|
||||
ghostteleportlocs += AR.name
|
||||
ghostteleportlocs[AR.name] = AR
|
||||
var/turf/picked = pick(get_area_turfs(AR.type))
|
||||
if (picked.z == 1 || picked.z == 3 || picked.z == 5)
|
||||
if (picked.z == 1 || picked.z == 5 || picked.z == 3)
|
||||
ghostteleportlocs += AR.name
|
||||
ghostteleportlocs[AR.name] = AR
|
||||
|
||||
@@ -147,6 +149,61 @@ proc/process_ghost_teleport_locs()
|
||||
/area/shuttle/escape/centcom
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape/transit // the area to pass through for 3 minute transit
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod1
|
||||
name = "Escape Pod One"
|
||||
music = "music/escape.ogg"
|
||||
|
||||
/area/shuttle/escape_pod1/station
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/escape_pod1/centcom
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod1/transit
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod2
|
||||
name = "Escape Pod Two"
|
||||
music = "music/escape.ogg"
|
||||
|
||||
/area/shuttle/escape_pod2/station
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/escape_pod2/centcom
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod2/transit
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod3
|
||||
name = "Escape Pod Three"
|
||||
music = "music/escape.ogg"
|
||||
|
||||
/area/shuttle/escape_pod3/station
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/escape_pod3/centcom
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod3/transit
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod5 //Pod 4 was lost to meteors
|
||||
name = "Escape Pod Five"
|
||||
music = "music/escape.ogg"
|
||||
|
||||
/area/shuttle/escape_pod5/station
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/escape_pod5/centcom
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/escape_pod5/transit
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/mining
|
||||
name = "Mining Shuttle"
|
||||
music = "music/escape.ogg"
|
||||
@@ -253,6 +310,7 @@ proc/process_ghost_teleport_locs()
|
||||
requires_power = 0
|
||||
luminosity = 1
|
||||
sd_lighting = 0
|
||||
has_gravity = 1
|
||||
|
||||
// === end remove
|
||||
|
||||
@@ -561,6 +619,10 @@ proc/process_ghost_teleport_locs()
|
||||
name = "Escape Shuttle Hallway"
|
||||
icon_state = "escape"
|
||||
|
||||
/area/hallway/secondary/construction
|
||||
name = "Construction Area"
|
||||
icon_state = "construction"
|
||||
|
||||
/area/hallway/secondary/entry
|
||||
name = "Arrival Shuttle Hallway"
|
||||
icon_state = "entry"
|
||||
@@ -683,16 +745,67 @@ proc/process_ghost_teleport_locs()
|
||||
name = "Law Office"
|
||||
icon_state = "law"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/area/holodeck
|
||||
name = "Holodeck"
|
||||
icon_state = "Holodeck"
|
||||
luminosity = 1
|
||||
sd_lighting = 0
|
||||
|
||||
/area/holodeck/alphadeck
|
||||
name = "Holodeck Alpha"
|
||||
|
||||
|
||||
/area/holodeck/source_plating
|
||||
name = "Holodeck - Off"
|
||||
icon_state = "Holodeck"
|
||||
|
||||
/area/holodeck/source_emptycourt
|
||||
name = "Holodeck - Empty Court"
|
||||
|
||||
/area/holodeck/source_boxingcourt
|
||||
name = "Holodeck - Boxing Court"
|
||||
|
||||
/area/holodeck/source_thunderdomecourt
|
||||
name = "Holodeck - Thunderdome Court"
|
||||
|
||||
/area/holodeck/source_beach
|
||||
name = "Holodeck - Beach"
|
||||
icon_state = "Holodeck" // Lazy.
|
||||
|
||||
/area/holodeck/source_burntest
|
||||
name = "Holodeck - Atmospheric Burn Test"
|
||||
|
||||
/area/holodeck/source_wildlife
|
||||
name = "Holodeck - Wildlife Simulation"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Engineering
|
||||
|
||||
/area/engine
|
||||
engineering
|
||||
|
||||
engine_smes
|
||||
name = "Engineering SMES"
|
||||
icon_state = "engine_smes"
|
||||
requires_power = 0//This area only covers the batteries and they deal with their own power
|
||||
|
||||
engineering
|
||||
name = "Engineering"
|
||||
icon_state = "engine"
|
||||
|
||||
particle_accelerator
|
||||
name = "Particle Accelerator"
|
||||
icon_state = "engine_pa"
|
||||
@@ -1014,6 +1127,10 @@ proc/process_ghost_teleport_locs()
|
||||
name = "Toxins Lab"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/toxins/storage
|
||||
name = "Toxin Storage"
|
||||
icon_state = "toxstorage"
|
||||
|
||||
/area/toxins/test_area
|
||||
name = "Toxins Lab Test Area"
|
||||
icon_state = "toxtest"
|
||||
@@ -1044,6 +1161,10 @@ proc/process_ghost_teleport_locs()
|
||||
name = "Autolathe Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/storage/art
|
||||
name = "Art Supply Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/storage/auxillary
|
||||
name = "Auxillary Storage"
|
||||
icon_state = "auxstorage"
|
||||
@@ -1302,6 +1423,7 @@ proc/process_ghost_teleport_locs()
|
||||
icon_state = "storage"
|
||||
|
||||
|
||||
|
||||
// Telecommunications Satellite
|
||||
|
||||
/area/tcommsat/entrance
|
||||
@@ -1343,6 +1465,10 @@ proc/process_ghost_teleport_locs()
|
||||
var/list/centcom_areas = list (
|
||||
/area/centcom,
|
||||
/area/shuttle/escape/centcom,
|
||||
/area/shuttle/escape_pod1/centcom,
|
||||
/area/shuttle/escape_pod2/centcom,
|
||||
/area/shuttle/escape_pod3/centcom,
|
||||
/area/shuttle/escape_pod5/centcom,
|
||||
/area/shuttle/transport1/centcom,
|
||||
/area/shuttle/transport2/centcom,
|
||||
/area/shuttle/administration/centcom,
|
||||
@@ -1353,6 +1479,10 @@ var/list/centcom_areas = list (
|
||||
var/list/the_station_areas = list (
|
||||
/area/shuttle/arrival,
|
||||
/area/shuttle/escape/station,
|
||||
/area/shuttle/escape_pod1/station,
|
||||
/area/shuttle/escape_pod2/station,
|
||||
/area/shuttle/escape_pod3/station,
|
||||
/area/shuttle/escape_pod5/station,
|
||||
/area/shuttle/mining/station,
|
||||
/area/shuttle/transport1/station,
|
||||
// /area/shuttle/transport2/station,
|
||||
@@ -1364,6 +1494,7 @@ var/list/the_station_areas = list (
|
||||
/area/hallway,
|
||||
/area/bridge,
|
||||
/area/crew_quarters,
|
||||
/area/holodeck,
|
||||
/area/mint,
|
||||
/area/library,
|
||||
/area/chapel,
|
||||
@@ -1389,6 +1520,8 @@ var/list/the_station_areas = list (
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
/area/beach
|
||||
name = "Keelin's private beach"
|
||||
icon_state = "null"
|
||||
|
||||
@@ -174,6 +174,10 @@ var
|
||||
list/BorgWireColorToIndex
|
||||
list/ScrambledFrequencies = list( ) //These are used for electrical storms, and anything else that jams radios.
|
||||
list/UnscrambledFrequencies = list( )
|
||||
list/AAlarmWireColorToFlag = RandomAAlarmWires() // Air Alarm hacking wires.
|
||||
list/AAlarmIndexToFlag
|
||||
list/AAlarmIndexToWireColor
|
||||
list/AAlarmWireColorToIndex
|
||||
|
||||
const/SPEED_OF_LIGHT = 3e8 //not exact but hey!
|
||||
const/SPEED_OF_LIGHT_SQ = 9e+16
|
||||
@@ -221,4 +225,4 @@ var
|
||||
forumsqllogin = "root"
|
||||
forumsqlpass = ""
|
||||
forum_activated_group = "2"
|
||||
forum_authenticated_group = "10"*/
|
||||
forum_authenticated_group = "10"*/
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/datum/marked_datum
|
||||
animate_movement = 2
|
||||
var/throwforce = 1
|
||||
|
||||
proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request)
|
||||
//Return: (NONSTANDARD)
|
||||
// null if object handles breathing logic for lifeform
|
||||
@@ -284,6 +285,15 @@
|
||||
opacity = 0
|
||||
density = 0
|
||||
|
||||
/obj/effect/sign/deathsposal
|
||||
desc = "A warning sign which reads 'DISPOSAL LEADS TO SPACE'"
|
||||
name = "DISPOSAL LEADS TO SPACE"
|
||||
icon = 'decals.dmi'
|
||||
icon_state = "deathsposal"
|
||||
anchored = 1.0
|
||||
opacity = 0
|
||||
density = 0
|
||||
|
||||
/obj/effect/sign/pods
|
||||
desc = "A warning sign which reads 'ESCAPE PODS'"
|
||||
name = "ESCAPE PODS"
|
||||
@@ -294,8 +304,8 @@
|
||||
density = 0
|
||||
|
||||
/obj/effect/sign/fire
|
||||
desc = "A warning sign which reads 'EXTREME TEMPERATURES'"
|
||||
name = "EXTREME TEMPERATURES"
|
||||
desc = "A warning sign which reads 'DANGER: FIRE'"
|
||||
name = "DANGER: FIRE"
|
||||
icon = 'decals.dmi'
|
||||
icon_state = "fire"
|
||||
anchored = 1.0
|
||||
@@ -600,6 +610,10 @@
|
||||
var/obj/structure/crematorium/connected = null
|
||||
anchored = 1.0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/structure/cable
|
||||
level = 1
|
||||
anchored =1
|
||||
@@ -610,8 +624,9 @@
|
||||
icon_state = "0-1"
|
||||
var/d1 = 0
|
||||
var/d2 = 1
|
||||
layer = 2.5
|
||||
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
|
||||
var/color="red"
|
||||
var/obj/structure/powerswitch/power_switch
|
||||
|
||||
/obj/structure/cable/yellow
|
||||
color="yellow"
|
||||
@@ -744,6 +759,7 @@
|
||||
desc = "Apply butt."
|
||||
icon = 'objects.dmi'
|
||||
icon_state = "stool"
|
||||
anchored = 1.0
|
||||
flags = FPRINT
|
||||
pressure_resistance = 3*ONE_ATMOSPHERE
|
||||
|
||||
@@ -751,8 +767,7 @@
|
||||
name = "bed"
|
||||
desc = "This is used to lie in, sleep in or strap on."
|
||||
icon_state = "bed"
|
||||
anchored = 1.0
|
||||
var/list/buckled_mobs = list( )
|
||||
var/mob/living/buckled_mob
|
||||
|
||||
/obj/structure/stool/bed/alien
|
||||
name = "Resting contraption"
|
||||
@@ -760,44 +775,30 @@
|
||||
icon_state = "abed"
|
||||
|
||||
|
||||
/obj/structure/stool/chair
|
||||
/obj/structure/stool/bed/chair //YES, chairs are a type of bed, which are a type of stool. This works, believe me. -Pete
|
||||
name = "chair"
|
||||
desc = "You sit in this. Either by will or force."
|
||||
icon_state = "chair"
|
||||
var/status = 0.0
|
||||
anchored = 1.0
|
||||
var/list/buckled_mobs = list( )
|
||||
|
||||
/obj/structure/stool/chair/comfy
|
||||
/obj/structure/stool/bed/chair/comfy
|
||||
name = "comfy chair"
|
||||
desc = "It looks comfy."
|
||||
|
||||
/obj/structure/stool/chair/comfy/brown
|
||||
/obj/structure/stool/bed/chair/comfy/brown
|
||||
icon_state = "comfychair_brown"
|
||||
|
||||
/obj/structure/stool/chair/comfy/beige
|
||||
/obj/structure/stool/bed/chair/comfy/beige
|
||||
icon_state = "comfychair_beige"
|
||||
|
||||
/obj/structure/stool/chair/comfy/teal
|
||||
/obj/structure/stool/bed/chair/comfy/teal
|
||||
icon_state = "comfychair_teal"
|
||||
|
||||
/obj/structure/stool/chair/comfy/black
|
||||
/obj/structure/stool/bed/chair/comfy/black
|
||||
icon_state = "comfychair_black"
|
||||
|
||||
/obj/structure/stool/chair/comfy/lime
|
||||
/obj/structure/stool/bed/chair/comfy/lime
|
||||
icon_state = "comfychair_lime"
|
||||
|
||||
/obj/structure/stool/chair/e_chair
|
||||
name = "electrified chair"
|
||||
desc = "Looks absolutely terrifying!"
|
||||
icon_state = "e_chair0"
|
||||
var/atom/movable/overlay/overl = null
|
||||
var/on = 0.0
|
||||
var/obj/item/assembly/shock_kit/part1 = null
|
||||
var/isshocking
|
||||
var/datum/effect/effect/system/spark_spread/spark = new /datum/effect/effect/system/spark_spread
|
||||
var/list/mob/living/affected = list()
|
||||
|
||||
/obj/structure/table
|
||||
name = "table"
|
||||
desc = "A square piece of metal standing on four metal legs. It can not move."
|
||||
@@ -1128,7 +1129,7 @@
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
POWERFLAG = rand(1,10)
|
||||
Uses = rand(2, 5)
|
||||
Uses = rand(7, 25)
|
||||
//flags |= NOREACT
|
||||
|
||||
spawn()
|
||||
@@ -1145,6 +1146,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/structure/noticeboard
|
||||
name = "Notice Board"
|
||||
icon = 'stationobjs.dmi'
|
||||
@@ -1197,19 +1199,6 @@
|
||||
new /obj/item/weapon/glass( src )
|
||||
*/
|
||||
|
||||
/obj/item/weapon/storage/cupbox
|
||||
name = "Paper-cup Box"
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
|
||||
/obj/structure/falsewall
|
||||
name = "wall"
|
||||
@@ -1349,9 +1338,34 @@
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
max_amount = 60
|
||||
|
||||
/obj/item/stack/sheet/plasteel
|
||||
name = "plasteel"
|
||||
singular_name = "plasteel sheet"
|
||||
desc = "This sheet is an alloy of iron and plasma."
|
||||
icon_state = "sheet-plasteel"
|
||||
item_state = "sheet-metal"
|
||||
m_amt = 7500
|
||||
throwforce = 15.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/obj/item/stack/tile/plasteel
|
||||
name = "floor tiles"
|
||||
singular_name = "floor tile"
|
||||
desc = "Those could work as a pretty decent throwing weapon"
|
||||
icon_state = "tile"
|
||||
w_class = 3.0
|
||||
force = 6.0
|
||||
m_amt = 937.5
|
||||
throwforce = 15.0
|
||||
throw_speed = 5
|
||||
throw_range = 20
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
max_amount = 60
|
||||
|
||||
/obj/item/stack/tile/grass
|
||||
name = "Grass tile"
|
||||
singular_name = "Grass floor tile"
|
||||
name = "grass tiles"
|
||||
singular_name = "grass floor tile"
|
||||
desc = "A patch of grass like they often use on golf courses"
|
||||
icon_state = "tile_grass"
|
||||
w_class = 3.0
|
||||
@@ -1364,8 +1378,8 @@
|
||||
origin_tech = "biotech=1"
|
||||
|
||||
/obj/item/stack/light_w
|
||||
name = "Wired glass tile"
|
||||
singular_name = "Wired glass tile"
|
||||
name = "wired glass tiles"
|
||||
singular_name = "wired glass floor tile"
|
||||
desc = "A glass tile, which is wired, somehow."
|
||||
icon_state = "glass_wire"
|
||||
w_class = 3.0
|
||||
@@ -1400,8 +1414,8 @@
|
||||
del(src)
|
||||
|
||||
/obj/item/stack/tile/light
|
||||
name = "Light floor tile"
|
||||
singular_name = "Light floor tile"
|
||||
name = "light tiles"
|
||||
singular_name = "light floor tile"
|
||||
desc = "A floor tile, made out off glass. It produces light."
|
||||
icon_state = "tile_e"
|
||||
w_class = 3.0
|
||||
@@ -1435,6 +1449,13 @@
|
||||
user.u_equip(src)
|
||||
del(src)
|
||||
|
||||
/obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
name = "cardboard"
|
||||
desc = "Large sheets of card, like boxes folded flat."
|
||||
singular_name = "cardboard sheet"
|
||||
icon_state = "sheet-card"
|
||||
flags = FPRINT | TABLEPASS
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/weapon/beach_ball
|
||||
icon = 'beach.dmi'
|
||||
@@ -1452,3 +1473,30 @@
|
||||
afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
|
||||
user.drop_item()
|
||||
src.throw_at(target, throw_range, throw_speed)
|
||||
|
||||
/obj/effect/stop
|
||||
var/victim = null
|
||||
icon_state = "empty"
|
||||
name = "Geas"
|
||||
desc = "You can't resist."
|
||||
// name = ""
|
||||
|
||||
|
||||
|
||||
/obj/debug/debugger
|
||||
name = "Quantum Debugger"
|
||||
desc = "A quantum debugger used by Centcomm Reality Engineers to help monitor transiant variables."
|
||||
icon = 'stationobjs.dmi'
|
||||
icon_state = "blackbox"
|
||||
|
||||
var/list/list1 = list()
|
||||
var/list/list2 = list()
|
||||
var/list/list3 = list()
|
||||
var/list/list4 = list()
|
||||
var/list/list5 = list()
|
||||
|
||||
var/var1 = null
|
||||
var/var2 = null
|
||||
var/var3 = null
|
||||
var/var4 = null
|
||||
var/var5 = null
|
||||
|
||||
@@ -48,7 +48,8 @@
|
||||
can_hold = list("/obj/item/weapon/dice")
|
||||
|
||||
/obj/item/weapon/storage/box
|
||||
name = "Box"
|
||||
name = "box"
|
||||
desc = "It's just an ordinary box."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
@@ -59,34 +60,50 @@
|
||||
desc = "Full of masks and emergency anesthetic tanks."
|
||||
|
||||
/obj/item/weapon/storage/box/syndicate
|
||||
icon_state = "box_of_doom"
|
||||
|
||||
/obj/item/weapon/storage/box/ert
|
||||
name = "medical box"
|
||||
desc = "Full of goodness."
|
||||
icon_state = "implant"
|
||||
item_state = "syringe_kit"
|
||||
/obj/item/weapon/storage/cupbox
|
||||
name = "box of paper cups"
|
||||
desc = "It has pictures of paper cups on the front."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
|
||||
|
||||
/obj/item/weapon/storage/pillbottlebox
|
||||
name = "pill bottles"
|
||||
desc = "A box of pill bottles."
|
||||
name = "box of pill bottles"
|
||||
desc = "It has pictures of pill bottles on its front."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/blankbox
|
||||
name = "blank shells"
|
||||
desc = "A box containing...stuff..."
|
||||
name = "box of blank shells"
|
||||
desc = "It has a picture of a gun and several warning symbols on the front."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/backpack/clown
|
||||
name = "clown's backpack"
|
||||
desc = "The backpack made by Honk. Co."
|
||||
name = "Giggles Von Honkerton"
|
||||
desc = "It's a backpack made by Honk! Co."
|
||||
icon_state = "clownpack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/medic
|
||||
name = "medic's backpack"
|
||||
desc = "The backpack used to keep with the sterile environment."
|
||||
name = "medical backpack"
|
||||
desc = "It's a backpack especially designed for use in a sterile environment."
|
||||
icon_state = "medicalpack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/medic/full
|
||||
@@ -102,17 +119,20 @@
|
||||
|
||||
/obj/item/weapon/storage/backpack/security
|
||||
name = "security backpack"
|
||||
desc = "A very robust backpack."
|
||||
desc = "It's a very robust backpack."
|
||||
icon_state = "securitypack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/satchel
|
||||
name = "Satchel"
|
||||
desc = "A very robust satchel to wear on your back."
|
||||
name = "satchel"
|
||||
desc = "It's a very robust satchel to wear on your back."
|
||||
icon_state = "satchel"
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/storage/backpack/bandolier
|
||||
name = "Bandolier"
|
||||
desc = "A very old bandolier to wear on your back."
|
||||
name = "bandolier"
|
||||
desc = "It's a very old bandolier to wear on your back."
|
||||
icon_state = "bandolier"
|
||||
|
||||
/obj/item/weapon/storage/backpack/medicalsatchel
|
||||
@@ -122,7 +142,7 @@
|
||||
|
||||
/obj/item/weapon/storage/backpack/industrial
|
||||
name = "industrial backpack"
|
||||
desc = "A tough backpack for the daily grind"
|
||||
desc = "It's a tough backpack for the daily grind of station life."
|
||||
icon_state = "engiepack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/industrial/full
|
||||
@@ -174,7 +194,7 @@
|
||||
|
||||
/obj/item/weapon/storage/briefcase
|
||||
name = "briefcase"
|
||||
desc = "Used by the lawyer in the court room."
|
||||
desc = "It's made of AUTHENTIC faux-leather and has a price-tag still attached. Its owner must be a real professional."
|
||||
icon_state = "briefcase"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
force = 8.0
|
||||
@@ -184,24 +204,90 @@
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 16
|
||||
|
||||
/obj/item/weapon/storage/wallet
|
||||
name = "wallet"
|
||||
desc = "It can hold a few small and personal things."
|
||||
storage_slots = 4
|
||||
icon_state = "wallet"
|
||||
can_hold = list(
|
||||
"/obj/item/weapon/spacecash",
|
||||
"/obj/item/weapon/card",
|
||||
"/obj/item/clothing/mask/cigarette",
|
||||
"/obj/item/device/flashlight/pen",
|
||||
"/obj/item/seeds",
|
||||
"/obj/item/stack/medical",
|
||||
"/obj/item/toy/crayon",
|
||||
"/obj/item/weapon/coin",
|
||||
"/obj/item/weapon/dice",
|
||||
"/obj/item/weapon/disk",
|
||||
"/obj/item/weapon/implanter",
|
||||
"/obj/item/weapon/lighter",
|
||||
"/obj/item/weapon/match",
|
||||
"/obj/item/weapon/paper",
|
||||
"/obj/item/weapon/pen",
|
||||
"/obj/item/weapon/photo",
|
||||
"/obj/item/weapon/reagent_containers/dropper",
|
||||
"/obj/item/weapon/screwdriver",
|
||||
"/obj/item/weapon/stamp")
|
||||
|
||||
attackby(obj/item/A as obj, mob/user as mob)
|
||||
..()
|
||||
update_icon()
|
||||
return
|
||||
|
||||
update_icon()
|
||||
for(var/obj/item/weapon/card/id/ID in contents)
|
||||
if(ID.icon_state == "gold")
|
||||
icon_state = "walletid_gold"
|
||||
return
|
||||
else if(ID.icon_state == "id")
|
||||
icon_state = "walletid"
|
||||
return
|
||||
icon_state = "wallet"
|
||||
|
||||
|
||||
|
||||
proc/get_id()
|
||||
for(var/obj/item/weapon/card/id/ID in contents)
|
||||
if(istype(ID))
|
||||
return ID
|
||||
|
||||
/obj/item/weapon/storage/wallet/random/New()
|
||||
..()
|
||||
var/item1_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500)
|
||||
var/item2_type
|
||||
if(prob(50))
|
||||
item2_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500)
|
||||
var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron )
|
||||
|
||||
spawn(2)
|
||||
if(item1_type)
|
||||
new item1_type(src)
|
||||
if(item2_type)
|
||||
new item2_type(src)
|
||||
if(item3_type)
|
||||
new item3_type(src)
|
||||
|
||||
|
||||
/obj/item/weapon/storage/disk_kit
|
||||
name = "data disks"
|
||||
desc = "For disks."
|
||||
name = "box of data disks"
|
||||
desc = "It has a picture of a data disk on it."
|
||||
icon_state = "id"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/disk_kit/disks
|
||||
|
||||
/obj/item/weapon/storage/disk_kit/disks2
|
||||
|
||||
/obj/item/weapon/storage/fcard_kit
|
||||
name = "Fingerprint Cards"
|
||||
desc = "This contains cards which are used to take fingerprints."
|
||||
name = "box of fingerprint cards"
|
||||
desc = "It has a picture of a fingerprint on each of its faces."
|
||||
icon_state = "id"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/firstaid
|
||||
name = "First-Aid"
|
||||
name = "first-aid kit"
|
||||
desc = "In case of injury."
|
||||
icon_state = "firstaid"
|
||||
throw_speed = 2
|
||||
@@ -209,7 +295,7 @@
|
||||
var/empty = 0
|
||||
|
||||
/obj/item/weapon/storage/firstaid/fire
|
||||
name = "Fire First Aid"
|
||||
name = "fire first-aid kit"
|
||||
desc = "Contains burn treatments."
|
||||
icon_state = "ointment"
|
||||
item_state = "firstaid-ointment"
|
||||
@@ -240,60 +326,78 @@
|
||||
desc = "<FONT color=red><B>WARNING: Do not use without reading these preautions!</B></FONT>\n<B>These devices are extremely dangerous and can cause blindness or deafness if used incorrectly.</B>\nThe chemicals contained in these devices have been tuned for maximal effectiveness and due to\nextreme safety precuaiotn shave been incased in a tamper-proof pack. DO NOT ATTEMPT TO OPEN\nFLASH WARNING: Do not use continually. Excercise extreme care when detonating in closed spaces.\n\tMake attemtps not to detonate withing range of 2 meters of the intended target. It is imperative\n\tthat the targets visit a medical professional after usage. Damage to eyes increases extremely per\n\tuse and according to range. Glasses with flash resistant filters DO NOT always work on high powered\n\tflash devices such as this. <B>EXERCISE CAUTION REGARDLESS OF CIRCUMSTANCES</B>\nSOUND WARNING: Do not use continually. Visit a medical professional if hearing is lost.\n\tThere is a slight chance per use of complete deafness. Exercise caution and restraint.\nSTUN WARNING: If the intended or unintended target is too close to detonation the resulting sound\n\tand flash have been known to cause extreme sensory overload resulting in temporary\n\tincapacitation.\n<B>DO NOT USE CONTINUALLY</B>\nOperating Directions:\n\t1. Pull detonnation pin. <B>ONCE THE PIN IS PULLED THE GRENADE CAN NOT BE DISARMED!</B>\n\t2. Throw grenade. <B>NEVER HOLD A LIVE FLASHBANG</B>\n\t3. The grenade will detonste 10 seconds hafter being primed. <B>EXCERCISE CAUTION</B>\n\t-<B>Never prime another grenade until after the first is detonated</B>\nNote: Usage of this pyrotechnic device without authorization is an extreme offense and can\nresult in severe punishment upwards of <B>10 years in prison per use</B>.\n\nDefault 3 second wait till from prime to detonation. This can be switched with a screwdriver\nto 10 seconds.\n\nCopyright of Nanotrasen Industries- Military Armnaments Division\nThis device was created by Nanotrasen Labs a member of the Expert Advisor Corporation"
|
||||
icon_state = "flashbang"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/emp_kit
|
||||
name = "emp grenades"
|
||||
desc = "A box with 5 emp grenades."
|
||||
icon_state = "flashbang"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/gl_kit
|
||||
name = "Prescription Glasses"
|
||||
desc = "This box contains vision correcting glasses."
|
||||
desc = "This box contains vison correcting glasses."
|
||||
icon_state = "glasses"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/seccart_kit
|
||||
name = "Spare R.O.B.U.S.T. Cartridges"
|
||||
desc = "A box full of R.O.B.U.S.T. Cartridges, used by Security."
|
||||
icon = 'pda.dmi'
|
||||
icon_state = "pdabox"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/handcuff_kit
|
||||
name = "Spare Handcuffs"
|
||||
desc = "A box full of handcuffs."
|
||||
icon_state = "handcuff"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/id_kit
|
||||
name = "Spare IDs"
|
||||
desc = "Has so many blank IDs."
|
||||
desc = "Has many empty IDs."
|
||||
icon_state = "id"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/lglo_kit
|
||||
name = "Latex Gloves"
|
||||
desc = "Contains white gloves."
|
||||
icon_state = "latex"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/injectbox
|
||||
name = "DNA-Injectors"
|
||||
desc = "This box contains injectors, it seems."
|
||||
desc = "This box contains injectors it seems."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/stma_kit
|
||||
name = "Sterile Masks"
|
||||
desc = "This box contains masks of +2 constitution." //I made it better. --SkyMarshal
|
||||
icon_state = "mask"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/trackimp_kit
|
||||
name = "Tracking Implant Kit"
|
||||
desc = "Box full of tracking utensils."
|
||||
desc = "Box full of tracking implants."
|
||||
icon_state = "implant"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/chemimp_kit
|
||||
name = "Chemical Implant Kit"
|
||||
desc = "Box of stuff used to implant chemicals."
|
||||
icon_state = "implant"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/deathalarm_kit
|
||||
name = "Death Alarm Kit"
|
||||
@@ -351,6 +455,7 @@
|
||||
|
||||
/obj/item/weapon/storage/toolbox/electrical
|
||||
name = "electrical toolbox"
|
||||
desc = "A toolbox for holding tools about electronics."
|
||||
icon_state = "yellow"
|
||||
item_state = "toolbox_yellow"
|
||||
|
||||
@@ -362,7 +467,7 @@
|
||||
item_state = "syringe_kit"
|
||||
|
||||
/obj/item/weapon/storage/toolbox/syndicate
|
||||
name = "Suspicious looking toolbox"
|
||||
name = "suspicious looking toolbox"
|
||||
desc = "You have no idea what this is."
|
||||
icon_state = "syndicate"
|
||||
item_state = "toolbox_syndi"
|
||||
@@ -403,25 +508,28 @@
|
||||
icon_state ="koran"
|
||||
|
||||
/obj/item/weapon/storage/mousetraps
|
||||
name = "Pest-B-Gon Mousetraps"
|
||||
desc = "WARNING: Keep out of reach of children."
|
||||
name = "box of Pest-B-Gon Mousetraps"
|
||||
desc = "<B><FONT=red>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
|
||||
icon_state = "mousetraps"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/donkpocket_kit
|
||||
name = "Donk-Pockets"
|
||||
desc = "Remember to fully heat prior to serving. Product will cool if not eaten within seven minutes."
|
||||
name = "box of donk-pockets"
|
||||
desc = "<B>Instructions:</B> <I>Heat in microwave. Product will cool if not eaten within seven minutes.</I>"
|
||||
icon_state = "donk_kit"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/condimentbottles
|
||||
name = "Condiment Bottles"
|
||||
desc = "A box of empty condiment bottles."
|
||||
name = "box of condiment bottles"
|
||||
desc = "It has a large ketchup smear on it."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/drinkingglasses
|
||||
name = "Drinking Glasses"
|
||||
desc = "A box of clean drinking glasses"
|
||||
name = "box of drinking glasses"
|
||||
desc = "It has a picture of drinking glasses on it."
|
||||
icon_state = "box"
|
||||
item_state = "syringe_kit"
|
||||
item_state = "syringe_kit"
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
icon = 'weapons.dmi'
|
||||
|
||||
/obj/item/weapon/offhand
|
||||
name = "Offhand"
|
||||
name = "offhand"
|
||||
var/linked_weapon_name = ""
|
||||
w_class = 5.0
|
||||
icon_state = "offhand"
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
/obj/item/weapon/shield/riot
|
||||
name = "riot shield"
|
||||
desc = "A shield adept at blocking blunt objects."
|
||||
desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder."
|
||||
icon = 'weapons.dmi'
|
||||
icon_state = "riot"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT| ONBACK
|
||||
@@ -29,15 +29,27 @@
|
||||
IsShield()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/nullrod
|
||||
name = "null rod"
|
||||
desc = "A rod of pure obsidian, its very presence disrupts and dampens the powers of Nar-Sie's followers."
|
||||
icon_state = "nullrod"
|
||||
item_state = "nullrod"
|
||||
flags = FPRINT | ONBELT | TABLEPASS
|
||||
force = 15
|
||||
throw_speed = 1
|
||||
throw_range = 4
|
||||
throwforce = 10
|
||||
w_class = 1
|
||||
|
||||
/*/obj/item/weapon/sord
|
||||
name = "SORD"
|
||||
name = "\improper SORD"
|
||||
desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
|
||||
icon_state = "sord"
|
||||
item_state = "sord"
|
||||
flags = FPRINT | ONBELT | TABLEPASS
|
||||
force = 2
|
||||
throwforce = 1
|
||||
w_class = 3 */
|
||||
w_class = 3*/
|
||||
|
||||
/obj/item/weapon/claymore
|
||||
name = "claymore"
|
||||
@@ -47,7 +59,7 @@
|
||||
flags = FPRINT | ONBELT | TABLEPASS
|
||||
force = 40
|
||||
throwforce = 10
|
||||
w_class = 3.0
|
||||
w_class = 3
|
||||
|
||||
IsShield()
|
||||
return 1
|
||||
@@ -68,7 +80,7 @@
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/obj/item/weapon/rsf
|
||||
name = "Rapid-Service-Fabricator (RSF)"
|
||||
name = "\improper Rapid-Service-Fabricator"
|
||||
desc = "A device used to rapidly deploy service items."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "rcd"
|
||||
@@ -81,7 +93,7 @@
|
||||
w_class = 3.0
|
||||
|
||||
/obj/item/weapon/rsp
|
||||
name = "Rapid-Seed-Producer (RSP)"
|
||||
name = "\improper Rapid-Seed-Producer"
|
||||
desc = "A device used to rapidly deploy seeds."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "rcd"
|
||||
@@ -94,7 +106,7 @@
|
||||
w_class = 3.0
|
||||
|
||||
/obj/item/weapon/rcd_ammo
|
||||
name = "Compressed matter cartridge"
|
||||
name = "compressed matter cartridge"
|
||||
desc = "Highly compressed matter for the RCD."
|
||||
icon = 'ammo.dmi'
|
||||
icon_state = "rcd"
|
||||
@@ -108,12 +120,13 @@
|
||||
var/ammo = 10
|
||||
|
||||
/obj/item/weapon/rcd_ammo/large
|
||||
name = "Super compressed matter cartridge"
|
||||
name = "super compressed matter cartridge"
|
||||
ammo = 30
|
||||
|
||||
/obj/item/weapon/spacecash
|
||||
name = "Space Cash"
|
||||
desc = "You're rich, bitch!"
|
||||
name = "space cash"
|
||||
desc = "It's worth 1 credit."
|
||||
gender = PLURAL
|
||||
icon = 'items.dmi'
|
||||
icon_state = "spacecash"
|
||||
opacity = 0
|
||||
@@ -130,25 +143,31 @@
|
||||
/obj/item/weapon/spacecash/c10
|
||||
icon_state = "spacecash10"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 10 credits."
|
||||
/obj/item/weapon/spacecash/c20
|
||||
icon_state = "spacecash20"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 20 credits."
|
||||
/obj/item/weapon/spacecash/c50
|
||||
icon_state = "spacecash50"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 50 credits."
|
||||
/obj/item/weapon/spacecash/c100
|
||||
icon_state = "spacecash100"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 100 credits."
|
||||
/obj/item/weapon/spacecash/c200
|
||||
icon_state = "spacecash200"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 200 credits."
|
||||
/obj/item/weapon/spacecash/c500
|
||||
icon_state = "spacecash500"
|
||||
access = access_crate_cash
|
||||
desc = "It's worth 500 credits."
|
||||
/obj/item/weapon/spacecash/c1000
|
||||
icon_state = "spacecash1000"
|
||||
access = access_crate_cash
|
||||
|
||||
desc = "It's worth 1000 credits."
|
||||
|
||||
/obj/item/device/mass_spectrometer
|
||||
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
|
||||
@@ -174,7 +193,7 @@
|
||||
origin_tech = "magnets=4;biotech=2"
|
||||
|
||||
/obj/item/weapon/melee/baton
|
||||
name = "Stun Baton"
|
||||
name = "stun baton"
|
||||
desc = "The police baton of the future."
|
||||
icon_state = "stunbaton"
|
||||
item_state = "baton"
|
||||
@@ -188,7 +207,7 @@
|
||||
origin_tech = "combat=2"
|
||||
|
||||
/*/obj/item/weapon/melee/chainofcommand
|
||||
name = "Chain of Command"
|
||||
name = "chain of command"
|
||||
desc = "The Captain is first and all other heads are last."
|
||||
icon_state = "chainofcommand"
|
||||
item_state = "chainofcommand"
|
||||
@@ -199,13 +218,13 @@
|
||||
var/charges = 50.0
|
||||
var/maximum_charges = 50.0
|
||||
var/status = 1
|
||||
origin_tech = "combat=4" */
|
||||
origin_tech = "combat=4"*/
|
||||
|
||||
/obj/item/weapon/melee/energy
|
||||
var/active = 0
|
||||
|
||||
/obj/item/weapon/melee/energy/axe
|
||||
name = "Axe"
|
||||
name = "energy axe"
|
||||
desc = "An energised battle axe."
|
||||
icon_state = "axe0"
|
||||
force = 40.0
|
||||
@@ -219,7 +238,7 @@
|
||||
/obj/item/weapon/melee/energy/sword
|
||||
var/color
|
||||
name = "energy sword"
|
||||
desc = "It cuts AND cooks at the same time!."
|
||||
desc = "It cuts AND cooks at the same time!"
|
||||
icon_state = "sword0"
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
@@ -252,7 +271,7 @@
|
||||
var/datum/effect/effect/system/spark_spread/spark_system
|
||||
|
||||
/obj/item/weapon/bananapeel
|
||||
name = "Banana Peel"
|
||||
name = "banana peel"
|
||||
desc = "A peel from a banana."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "banana_peel"
|
||||
@@ -263,8 +282,9 @@
|
||||
throw_range = 20
|
||||
|
||||
/obj/item/weapon/soap
|
||||
name = "Soap"
|
||||
name = "soap"
|
||||
desc = "A cheap bar of soap. Doesn't smell."
|
||||
gender = PLURAL
|
||||
icon = 'items.dmi'
|
||||
icon_state = "soap"
|
||||
w_class = 1.0
|
||||
@@ -362,7 +382,7 @@
|
||||
color = "brown"
|
||||
|
||||
/obj/item/weapon/bikehorn
|
||||
name = "Bike Horn"
|
||||
name = "bike horn"
|
||||
desc = "A horn off of a bicycle."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "bike_horn"
|
||||
@@ -404,6 +424,7 @@
|
||||
/obj/item/stack/medical/ointment
|
||||
name = "ointment"
|
||||
desc = "Used to treat those nasty burns."
|
||||
gender = PLURAL
|
||||
singular_name = "ointment"
|
||||
icon_state = "ointment"
|
||||
heal_burn = 1
|
||||
@@ -419,19 +440,23 @@
|
||||
|
||||
/obj/item/stack/medical/advanced/bruise_pack
|
||||
name = "advanced trauma kit"
|
||||
singular_name = "advanced bruise pack"
|
||||
singular_name = "advanced trauma kit"
|
||||
desc = "An advanced trauma kit for severe injuries."
|
||||
icon_state = "brutepack"
|
||||
icon_state = "traumakit"
|
||||
heal_brute = 1
|
||||
origin_tech = "biotech=1"
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
|
||||
/obj/item/stack/medical/advanced/ointment
|
||||
name = "advanced burn kit"
|
||||
singular_name = "advanced burn kit"
|
||||
desc = "An advanced treatment kit for severe burns."
|
||||
icon_state = "ointment"
|
||||
icon_state = "burnkit"
|
||||
heal_burn = 1
|
||||
origin_tech = "biotech=1"
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
|
||||
/obj/item/weapon/c_tube
|
||||
name = "cardboard tube"
|
||||
@@ -452,6 +477,92 @@
|
||||
w_class = 2.0
|
||||
origin_tech = "magnets=1"
|
||||
|
||||
/obj/item/weapon/card
|
||||
name = "card"
|
||||
desc = "Does card things."
|
||||
icon = 'card.dmi'
|
||||
w_class = 1.0
|
||||
|
||||
var/list/files = list( )
|
||||
|
||||
/obj/item/weapon/card/data
|
||||
name = "data disk"
|
||||
desc = "A disk of data."
|
||||
icon_state = "data"
|
||||
var/function = "storage"
|
||||
var/data = "null"
|
||||
var/special = null
|
||||
item_state = "card-id"
|
||||
|
||||
/obj/item/weapon/card/data/clown
|
||||
name = "coordinates to clown planet"
|
||||
icon_state = "data"
|
||||
item_state = "card-id"
|
||||
layer = 3
|
||||
level = 2
|
||||
desc = "This card contains coordinates to the fabled Clown Planet. Handle with care."
|
||||
function = "teleporter"
|
||||
data = "Clown Land"
|
||||
|
||||
/obj/item/weapon/card/emag
|
||||
desc = "An identification card. Seems to have some funny chip on it, though."
|
||||
name = "modified identification card"
|
||||
icon_state = "emag"
|
||||
item_state = "card-id"
|
||||
origin_tech = "magnets=2;syndicate=2"
|
||||
var/uses = 5
|
||||
|
||||
/obj/item/weapon/card/id
|
||||
name = "identification card"
|
||||
desc = "An identification card."
|
||||
icon_state = "id"
|
||||
item_state = "card-id"
|
||||
var/access = list()
|
||||
var/registered_name = null
|
||||
var/assignment = null
|
||||
var/obj/item/weapon/photo/PHOTO = null
|
||||
var/over_jumpsuit = 1 // If set to 0, it won't display on top of the mob's jumpsuit
|
||||
var/dorm = 0 // determines if this ID has claimed a dorm already
|
||||
|
||||
/obj/item/weapon/card/id/gold
|
||||
name = "identification card"
|
||||
desc = "A golden card which shows authority."
|
||||
icon_state = "gold"
|
||||
item_state = "gold_id"
|
||||
|
||||
/obj/item/weapon/card/id/syndicate
|
||||
name = "agent card"
|
||||
desc = "Shhhhh."
|
||||
access = list(access_maint_tunnels)
|
||||
origin_tech = "syndicate=3"
|
||||
|
||||
/obj/item/weapon/card/id/syndicate_command
|
||||
name = "syndicate ID card"
|
||||
desc = "An ID straight from the Syndicate."
|
||||
registered_name = "Syndicate"
|
||||
assignment = "Syndicate Overlord"
|
||||
access = list(access_syndicate)
|
||||
|
||||
/obj/item/weapon/card/id/captains_spare
|
||||
name = "captain's spare ID"
|
||||
desc = "The spare ID of the Captain himself."
|
||||
icon_state = "gold"
|
||||
item_state = "gold_id"
|
||||
registered_name = "Captain"
|
||||
assignment = "Captain"
|
||||
New()
|
||||
access = get_access("Captain")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/card/id/centcom
|
||||
name = "\improper CentCom. ID"
|
||||
desc = "An ID straight from Cent. Com."
|
||||
icon_state = "centcom"
|
||||
registered_name = "Central Command"
|
||||
assignment = "General"
|
||||
New()
|
||||
access = get_all_centcom_access()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/cleaner
|
||||
desc = "A chemical that cleans messes."
|
||||
@@ -586,7 +697,7 @@
|
||||
|
||||
/obj/item/weapon/fireaxe // DEM AXES MAN, marker -Agouri
|
||||
icon_state = "fireaxe0"
|
||||
name = "Fire axe"
|
||||
name = "fire axe"
|
||||
desc = "A tool for breaking down those obstructions that stop you from fighting that fire." //Less ROBUST. --SkyMarshal
|
||||
force = 5
|
||||
w_class = 4.0
|
||||
@@ -616,7 +727,7 @@
|
||||
icon = 'items.dmi'
|
||||
|
||||
/obj/item/weapon/disk/nuclear
|
||||
name = "Nuclear Authentication Disk"
|
||||
name = "nuclear authentication disk"
|
||||
desc = "Better keep this safe, it can activate the nuke."
|
||||
icon_state = "nucleardisk"
|
||||
item_state = "card-id"
|
||||
@@ -646,7 +757,7 @@
|
||||
m_amt = 90
|
||||
|
||||
/obj/item/weapon/f_card
|
||||
name = "Finger Print Card"
|
||||
name = "finger print card"
|
||||
desc = "Used to take fingerprints."
|
||||
icon = 'card.dmi'
|
||||
icon_state = "fingerprint0"
|
||||
@@ -659,7 +770,7 @@
|
||||
|
||||
|
||||
/obj/item/weapon/fcardholder
|
||||
name = "Finger Print Case"
|
||||
name = "fingerprint card case"
|
||||
desc = "Holds fingerprint cards."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "fcardholder0"
|
||||
@@ -726,6 +837,7 @@
|
||||
/obj/item/weapon/handcuffs
|
||||
name = "handcuffs"
|
||||
desc = "Use this to keep prisoners in line."
|
||||
gender = PLURAL
|
||||
icon = 'items.dmi'
|
||||
icon_state = "handcuff"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT | ONBELT
|
||||
@@ -786,6 +898,10 @@
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
/obj/item/weapon/caution/cone
|
||||
desc = "This cone is trying to warn you of something!"
|
||||
name = "warning cone"
|
||||
icon_state = "cone"
|
||||
|
||||
/obj/item/weapon/paper
|
||||
name = "Paper"
|
||||
@@ -801,7 +917,6 @@
|
||||
var/list/stamped
|
||||
var/see_face = 1
|
||||
var/body_parts_covered = HEAD
|
||||
protective_temperature = T0C + 10
|
||||
var/heat_transfer_coefficient = 0.99
|
||||
var/gas_transfer_coefficient = 1
|
||||
var/permeability_coefficient = 0.99
|
||||
@@ -809,7 +924,8 @@
|
||||
var/iteration
|
||||
|
||||
/obj/item/weapon/directions
|
||||
name = "Crumpled Paper"
|
||||
name = "crumpled paper"
|
||||
gender = PLURAL
|
||||
desc = "This is a crumpled piece of paper."
|
||||
icon = 'weapons.dmi'
|
||||
icon_state = "crumpled"
|
||||
@@ -823,7 +939,7 @@
|
||||
name = "paper - 'Judgement'"
|
||||
info = "For crimes against the station, the offender is sentenced to:<BR>\n<BR>\n"
|
||||
|
||||
/obj/item/weapon/paper/certificate //What is this? -Kaleb702
|
||||
/obj/item/weapon/paper/certificate
|
||||
name = "paper - 'Certificate'"
|
||||
info = "Due to this person's unique actions in the past, we hereby certify that they are \"Totally Radical\"<br><br>----<b>Central Command</b><BR><i>This paper has been stamped with the central command rubber stamp.</i><BR>"
|
||||
stamped = list(/obj/item/weapon/stamp/centcom)
|
||||
@@ -895,8 +1011,8 @@
|
||||
name = "multicolor pen"
|
||||
|
||||
/obj/item/weapon/banhammer
|
||||
desc = "A banhammer."
|
||||
name = "Banhammer"
|
||||
desc = "A banhammer"
|
||||
name = "banhammer"
|
||||
icon = 'items.dmi'
|
||||
icon_state = "toyhammer"
|
||||
flags = FPRINT | ONBELT | TABLEPASS
|
||||
@@ -924,8 +1040,8 @@
|
||||
m_amt = 3750
|
||||
|
||||
/obj/item/weapon/rubber_chicken
|
||||
name = "Rubber Chicken"
|
||||
desc = "A rubber chicken. Isn't that hilarious?"
|
||||
name = "rubber chicken"
|
||||
desc = "A rubber chicken, isn't that hilarious?"
|
||||
icon = 'items.dmi'
|
||||
icon_state = "rubber_chicken"
|
||||
item_state = "rubber_chicken"
|
||||
@@ -933,7 +1049,7 @@
|
||||
|
||||
/obj/item/weapon/screwdriver
|
||||
name = "screwdriver"
|
||||
desc = "You can be totally screwy with this."
|
||||
desc = "Used for screwing."
|
||||
icon = 'items.dmi'
|
||||
icon_state = "screwdriver"
|
||||
flags = FPRINT | TABLEPASS| CONDUCT
|
||||
@@ -957,8 +1073,8 @@
|
||||
g_amt = 3750
|
||||
|
||||
/obj/item/weapon/SWF_uplink
|
||||
name = "station bounced radio"
|
||||
desc = "Used to communicate it appears."
|
||||
name = "station-bounced radio"
|
||||
desc = "used to comunicate it appears."
|
||||
icon = 'radio.dmi'
|
||||
icon_state = "radio"
|
||||
var/temp = null
|
||||
@@ -988,6 +1104,7 @@
|
||||
var/temp = null
|
||||
var/spell_type = "verb"
|
||||
var/max_uses = 5
|
||||
var/op = 1
|
||||
|
||||
/obj/item/weapon/spellbook/object_type_spells //used for giving out object spells as opposed to verb spells
|
||||
spell_type = "object"
|
||||
@@ -1021,6 +1138,7 @@
|
||||
/obj/item/weapon/table_parts
|
||||
name = "table parts"
|
||||
desc = "Parts of a table. Poor table."
|
||||
gender = PLURAL
|
||||
icon = 'items.dmi'
|
||||
icon_state = "table_parts"
|
||||
m_amt = 3750
|
||||
@@ -1041,7 +1159,7 @@
|
||||
flags = null
|
||||
|
||||
/obj/item/weapon/teleportation_scroll
|
||||
name = "Teleportation Scroll"
|
||||
name = "scroll of teleportation"
|
||||
desc = "A scroll for moving around."
|
||||
icon = 'wizard.dmi'
|
||||
icon_state = "scroll"
|
||||
@@ -1092,7 +1210,7 @@
|
||||
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
|
||||
|
||||
/obj/item/weapon/cell/crap
|
||||
name = "Nanotrasen Brand Rechargable AA Battery"
|
||||
name = "\improper NanoTrasen Brand Rechargable AA Battery"
|
||||
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
|
||||
origin_tech = "powerstorage=0"
|
||||
maxcharge = 500
|
||||
@@ -1106,7 +1224,7 @@
|
||||
|
||||
/obj/item/weapon/cell/super
|
||||
name = "super-capacity power cell"
|
||||
origin_tech = "powerstorage=3"
|
||||
origin_tech = "powerstorage=5"
|
||||
maxcharge = 20000
|
||||
g_amt = 70
|
||||
|
||||
@@ -1125,7 +1243,7 @@
|
||||
return 1
|
||||
|
||||
/*/obj/item/weapon/cell/potato
|
||||
name = "Potato Battery" // This needs more Portal 2 refs. -Kaleb702
|
||||
name = "Potato Battery"
|
||||
desc = "A rechargable starch based power cell."
|
||||
icon = 'harvest.dmi'
|
||||
icon_state = "potato_battery"
|
||||
@@ -1180,7 +1298,7 @@
|
||||
g_amt = 50
|
||||
|
||||
/obj/item/weapon/module/id_auth
|
||||
name = "ID authentication module"
|
||||
name = "\improper ID authentication module"
|
||||
icon_state = "id_mod"
|
||||
desc = "A module allowing secure authorization of ID cards."
|
||||
|
||||
@@ -1228,7 +1346,7 @@
|
||||
w_class = 3.0
|
||||
|
||||
/obj/item/weapon/kitchenknife
|
||||
name = "Kitchen knife"
|
||||
name = "kitchen knife"
|
||||
icon = 'kitchen.dmi'
|
||||
icon_state = "knife"
|
||||
desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
|
||||
@@ -1242,7 +1360,7 @@
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/weapon/butch
|
||||
name = "Butcher's Cleaver"
|
||||
name = "butcher's cleaver"
|
||||
icon = 'kitchen.dmi'
|
||||
icon_state = "butch"
|
||||
desc = "A huge thing used for chopping and chopping up meat."
|
||||
@@ -1256,10 +1374,10 @@
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/weapon/tray
|
||||
name = "Tray"
|
||||
name = "tray"
|
||||
icon = 'food.dmi'
|
||||
icon_state = "tray"
|
||||
desc = "A plastic tray to lay food on."
|
||||
desc = "A tray to lay food on."
|
||||
throwforce = 12.0
|
||||
throwforce = 10.0
|
||||
throw_speed = 1
|
||||
@@ -1392,7 +1510,7 @@
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
|
||||
/obj/item/weapon/syntiflesh
|
||||
name = "Syntiflesh"
|
||||
name = "syntiflesh"
|
||||
desc = "Meat that appears...strange..."
|
||||
icon = 'food.dmi'
|
||||
icon_state = "meat"
|
||||
@@ -1400,6 +1518,20 @@
|
||||
w_class = 1.0
|
||||
origin_tech = "biotech=2"
|
||||
|
||||
/*/obj/item/weapon/hatchet
|
||||
name = "hatchet"
|
||||
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
|
||||
icon = 'weapons.dmi'
|
||||
icon_state = "hatchet"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
force = 12.0
|
||||
w_class = 1.0
|
||||
throwforce = 15.0
|
||||
throw_speed = 4
|
||||
throw_range = 4
|
||||
m_amt = 15000
|
||||
origin_tech = "materials=2;combat=1"*/
|
||||
|
||||
/obj/item/weapon/stamp
|
||||
desc = "A rubber stamp for stamping important documents."
|
||||
name = "rubber stamp"
|
||||
@@ -1499,8 +1631,17 @@
|
||||
name = "d6"
|
||||
desc = "A dice with six sides."
|
||||
var/sides = 6
|
||||
icon_state = "dice"
|
||||
item_state = "dice"
|
||||
icon = 'dice.dmi'
|
||||
icon_state = "d66"
|
||||
|
||||
/obj/item/weapon/dice/New()
|
||||
icon_state = "[name][rand(sides)]"
|
||||
|
||||
/obj/item/weapon/dice/d20 // -- TLE
|
||||
name = "d20"
|
||||
desc = "A dice with twenty sides."
|
||||
sides = 20
|
||||
icon_state = "d2020"
|
||||
|
||||
/obj/item/weapon/dice/d8 // -- SkyMarshal
|
||||
name = "d8"
|
||||
@@ -1515,14 +1656,6 @@
|
||||
sides = 12
|
||||
icon_state = "d20"
|
||||
item_state = "dice"
|
||||
|
||||
/obj/item/weapon/dice/d20 // -- TLE
|
||||
name = "d20"
|
||||
desc = "A dice with...hell, that is a lot of sides."
|
||||
sides = 20
|
||||
icon_state = "d20"
|
||||
item_state = "dice"
|
||||
|
||||
/obj/item/weapon/pai_cable
|
||||
desc = "A flexible coated cable with a universal jack on one end."
|
||||
desc = "Some spacey cable."
|
||||
@@ -1532,8 +1665,9 @@
|
||||
var/obj/machinery/machine
|
||||
|
||||
/obj/item/weapon/plastique
|
||||
name = "Plastic Explosives"
|
||||
name = "plastic explosives"
|
||||
desc = "Used to put holes in specific areas without too much extra hole."
|
||||
gender = PLURAL
|
||||
icon = 'assemblies.dmi'
|
||||
icon_state = "plastic-explosive0"
|
||||
item_state = "plasticx"
|
||||
@@ -1548,6 +1682,7 @@
|
||||
/obj/item/weapon/stock_parts
|
||||
name = "stock part"
|
||||
desc = "What?"
|
||||
gender = PLURAL
|
||||
icon = 'stock_parts.dmi'
|
||||
w_class = 2.0
|
||||
var/rating = 1
|
||||
@@ -1558,14 +1693,14 @@
|
||||
//Rank 1
|
||||
|
||||
/obj/item/weapon/stock_parts/console_screen
|
||||
name = "Console Screen"
|
||||
name = "console screen"
|
||||
desc = "Used in the construction of computers and other devices with a interactive console."
|
||||
icon_state = "screen"
|
||||
origin_tech = "materials=1"
|
||||
g_amt = 200
|
||||
|
||||
/obj/item/weapon/stock_parts/capacitor
|
||||
name = "Capacitor"
|
||||
name = "capacitor"
|
||||
desc = "A basic capacitor used in the construction of a variety of devices."
|
||||
icon_state = "capacitor"
|
||||
origin_tech = "powerstorage=1"
|
||||
@@ -1573,7 +1708,7 @@
|
||||
g_amt = 50
|
||||
|
||||
/obj/item/weapon/stock_parts/scanning_module
|
||||
name = "Scanning Module"
|
||||
name = "scanning module"
|
||||
desc = "A compact, high resolution scanning module used in the construction of certain devices."
|
||||
icon_state = "scan_module"
|
||||
origin_tech = "magnets=1"
|
||||
@@ -1581,14 +1716,14 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/manipulator
|
||||
name = "Micro-Manipulator"
|
||||
name = "micro-manipulator"
|
||||
desc = "A tiny little manipulator used in the construction of certain devices."
|
||||
icon_state = "micro_mani"
|
||||
origin_tech = "materials=1;programming=1"
|
||||
m_amt = 30
|
||||
|
||||
/obj/item/weapon/stock_parts/micro_laser
|
||||
name = "Micro-laser"
|
||||
name = "micro-laser"
|
||||
desc = "A tiny laser used in certain devices."
|
||||
icon_state = "micro_laser"
|
||||
origin_tech = "magnets=1"
|
||||
@@ -1596,7 +1731,7 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/matter_bin
|
||||
name = "Matter Bin"
|
||||
name = "matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
icon_state = "matter_bin"
|
||||
origin_tech = "materials=1"
|
||||
@@ -1605,7 +1740,7 @@
|
||||
//Rank 2
|
||||
|
||||
/obj/item/weapon/stock_parts/capacitor/adv
|
||||
name = "Advanced Capacitor"
|
||||
name = "advanced capacitor"
|
||||
desc = "An advanced capacitor used in the construction of a variety of devices."
|
||||
origin_tech = "powerstorage=3"
|
||||
rating = 2
|
||||
@@ -1613,7 +1748,7 @@
|
||||
g_amt = 50
|
||||
|
||||
/obj/item/weapon/stock_parts/scanning_module/adv
|
||||
name = "Advanced Scanning Module"
|
||||
name = "advanced scanning module"
|
||||
desc = "A compact, high resolution scanning module used in the construction of certain devices."
|
||||
icon_state = "scan_module"
|
||||
origin_tech = "magnets=3"
|
||||
@@ -1622,7 +1757,7 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/manipulator/nano
|
||||
name = "Nano-Manipulator"
|
||||
name = "nano-manipulator"
|
||||
desc = "A tiny little manipulator used in the construction of certain devices."
|
||||
icon_state = "micro_mani"
|
||||
origin_tech = "materials=3,programming=2"
|
||||
@@ -1630,7 +1765,7 @@
|
||||
m_amt = 30
|
||||
|
||||
/obj/item/weapon/stock_parts/micro_laser/high
|
||||
name = "High-Power Micro-laser"
|
||||
name = "high-power micro-laser"
|
||||
desc = "A tiny laser used in certain devices."
|
||||
icon_state = "micro_laser"
|
||||
origin_tech = "magnets=3"
|
||||
@@ -1639,7 +1774,7 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/matter_bin/adv
|
||||
name = "Advanced Matter Bin"
|
||||
name = "advanced matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
icon_state = "matter_bin"
|
||||
origin_tech = "materials=3"
|
||||
@@ -1649,15 +1784,15 @@
|
||||
//Rating 3
|
||||
|
||||
/obj/item/weapon/stock_parts/capacitor/super
|
||||
name = "Super Capacitor"
|
||||
name = "super capacitor"
|
||||
desc = "A super-high capacity capacitor used in the construction of a variety of devices."
|
||||
origin_tech = "powerstorage=5;materials=4"
|
||||
origin_tech = "powerstorage=3;materials=4"
|
||||
rating = 3
|
||||
m_amt = 50
|
||||
g_amt = 50
|
||||
|
||||
/obj/item/weapon/stock_parts/scanning_module/phasic
|
||||
name = "Phasic Scanning Module"
|
||||
name = "phasic scanning module"
|
||||
desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
|
||||
origin_tech = "magnets=5"
|
||||
rating = 3
|
||||
@@ -1665,14 +1800,14 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/manipulator/pico
|
||||
name = "Pico-Manipulator"
|
||||
name = "pico-manipulator"
|
||||
desc = "A tiny little manipulator used in the construction of certain devices."
|
||||
origin_tech = "materials=5,programming=2"
|
||||
rating = 3
|
||||
m_amt = 30
|
||||
|
||||
/obj/item/weapon/stock_parts/micro_laser/ultra
|
||||
name = "Ultra-High-Power Micro-laser"
|
||||
name = "ultra-high-power micro-laser"
|
||||
desc = "A tiny laser used in certain devices."
|
||||
origin_tech = "magnets=5"
|
||||
rating = 3
|
||||
@@ -1680,7 +1815,7 @@
|
||||
g_amt = 20
|
||||
|
||||
/obj/item/weapon/stock_parts/matter_bin/super
|
||||
name = "Super Matter Bin"
|
||||
name = "super matter bin"
|
||||
desc = "A container for hold compressed matter awaiting re-construction."
|
||||
origin_tech = "materials=5"
|
||||
rating = 3
|
||||
@@ -1689,7 +1824,7 @@
|
||||
// Subspace stock parts
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/ansible
|
||||
name = "Subspace Ansible"
|
||||
name = "subspace ansible"
|
||||
icon_state = "subspace_ansible"
|
||||
desc = "A compact module capable of sensing extradimensional activity."
|
||||
origin_tech = "programming=3;magnets=5;materials=4;bluespace=2"
|
||||
@@ -1697,7 +1832,7 @@
|
||||
g_amt = 10
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/filter
|
||||
name = "Hyperwave Filter"
|
||||
name = "hyperwave filter"
|
||||
icon_state = "hyperwave_filter"
|
||||
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
|
||||
origin_tech = "programming=4;magnets=2"
|
||||
@@ -1705,7 +1840,7 @@
|
||||
g_amt = 10
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/amplifier
|
||||
name = "Subspace Amplifier"
|
||||
name = "subspace amplifier"
|
||||
icon_state = "subspace_amplifier"
|
||||
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
|
||||
origin_tech = "programming=3;magnets=4;materials=4;bluespace=2"
|
||||
@@ -1713,7 +1848,7 @@
|
||||
g_amt = 10
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/treatment
|
||||
name = "Subspace Treatment Disk"
|
||||
name = "subspace treatment disk"
|
||||
icon_state = "treatment_disk"
|
||||
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
|
||||
origin_tech = "programming=3;magnets=2;materials=5;bluespace=2"
|
||||
@@ -1721,7 +1856,7 @@
|
||||
g_amt = 10
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/analyzer
|
||||
name = "Subspace Wavelength Analyzer"
|
||||
name = "subspace wavelength analyzer"
|
||||
icon_state = "wavelength_analyzer"
|
||||
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
|
||||
origin_tech = "programming=3;magnets=4;materials=4;bluespace=2"
|
||||
@@ -1729,15 +1864,22 @@
|
||||
g_amt = 10
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/crystal
|
||||
name = "Ansible Crystal"
|
||||
name = "ansible crystal"
|
||||
icon_state = "ansible_crystal"
|
||||
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
|
||||
origin_tech = "magnets=4;materials=4;bluespace=2"
|
||||
g_amt = 50
|
||||
|
||||
/obj/item/weapon/stock_parts/subspace/transmitter
|
||||
name = "Subspace Transmitter"
|
||||
name = "subspace transmitter"
|
||||
icon_state = "subspace_transmitter"
|
||||
desc = "A large piece of equipment used to open a window into the subspace dimension."
|
||||
origin_tech = "magnets=5;materials=5;bluespace=3"
|
||||
m_amt = 50
|
||||
m_amt = 50
|
||||
|
||||
/obj/item/weapon/ectoplasm
|
||||
name = "ectoplasm"
|
||||
desc = "spooky"
|
||||
gender = PLURAL
|
||||
icon = 'wizard.dmi'
|
||||
icon_state = "ectoplasm"
|
||||
@@ -820,6 +820,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
mob_list.Add(M)
|
||||
for(var/mob/living/carbon/metroid/M in world)
|
||||
mob_list.Add(M)
|
||||
for(var/mob/living/simple_animal/M in world)
|
||||
mob_list.Add(M)
|
||||
// for(var/mob/living/silicon/hivebot/M in world)
|
||||
// mob_list.Add(M)
|
||||
// for(var/mob/living/silicon/hive_mainframe/M in world)
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
name = "changeling"
|
||||
config_tag = "changeling"
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
required_players = 1
|
||||
required_players = 15
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
var
|
||||
changeling_amount
|
||||
const
|
||||
prob_int_murder_target = 50 // intercept names the assassination target half the time
|
||||
prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
|
||||
@@ -35,16 +35,18 @@
|
||||
waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
|
||||
|
||||
var/const/scaling_coeff = 10.0 //how many players per changeling
|
||||
const/changeling_amount = 4
|
||||
|
||||
/datum/game_mode/changeling/announce()
|
||||
world << "<B>The current game mode is - Changeling!</B>"
|
||||
world << "<B>There are alien changelings on the station. Do not let the changelings succeed!</B>"
|
||||
|
||||
/datum/game_mode/changeling/pre_setup()
|
||||
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
|
||||
|
||||
changeling_amount = max(1, round( num_players() / scaling_coeff) + 1)
|
||||
if(config.protect_roles_from_antagonist)
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
var/list/datum/mind/possible_changelings = get_players_for_role(BE_CHANGELING)
|
||||
|
||||
for(var/datum/mind/player in possible_changelings)
|
||||
for(var/job in restricted_jobs)//Removing robots from the list
|
||||
@@ -184,8 +186,10 @@
|
||||
for(var/datum/objective/objective in changeling.objectives)
|
||||
if(objective.check_completion())
|
||||
world << "<B>Objective #[count]</B>: [objective.explanation_text] \green <B>Success</B>"
|
||||
feedback_add_details("changeling_objective","[objective.type]|SUCCESS")
|
||||
else
|
||||
world << "<B>Objective #[count]</B>: [objective.explanation_text] \red Failed"
|
||||
feedback_add_details("changeling_objective","[objective.type]|FAIL")
|
||||
changelingwin = 0
|
||||
count++
|
||||
|
||||
@@ -195,8 +199,10 @@
|
||||
|
||||
if(changelingwin)
|
||||
world << "<B>The changeling was successful!<B>"
|
||||
feedback_add_details("changeling_success","SUCCESS")
|
||||
else
|
||||
world << "<B>The changeling has failed!<B>"
|
||||
feedback_add_details("changeling_success","FAIL")
|
||||
return 1
|
||||
|
||||
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
|
||||
@@ -204,11 +210,17 @@
|
||||
var/list/absorbed_dna = list()
|
||||
var/changeling_fakedeath = 0
|
||||
var/chem_charges = 20.00
|
||||
var/chem_recharge_multiplier = 1
|
||||
var/chem_storage = 50
|
||||
var/sting_range = 1
|
||||
var/changelingID = "none"
|
||||
var/mob/living/host = null
|
||||
var/geneticdamage = 0.0
|
||||
var/isabsorbing = 0
|
||||
var/geneticpoints = 5
|
||||
var/purchasedpowers = list()
|
||||
|
||||
|
||||
|
||||
/datum/changeling/New()
|
||||
..()
|
||||
|
||||
@@ -2,14 +2,21 @@
|
||||
if(!changeling) changeling = new
|
||||
changeling.host = src
|
||||
|
||||
src.verbs += /client/proc/changeling_lesser_transform
|
||||
src.verbs += /client/proc/changeling_fakedeath
|
||||
src.verbs += /datum/changeling/proc/EvolutionMenu
|
||||
|
||||
for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers)
|
||||
if(P.isVerb)
|
||||
if(P.allowduringlesserform)
|
||||
if(!(P in src.verbs))
|
||||
src.verbs += P.verbpath
|
||||
|
||||
/* src.verbs += /client/proc/changeling_fakedeath
|
||||
src.verbs += /client/proc/changeling_lesser_transform
|
||||
src.verbs += /client/proc/changeling_blind_sting
|
||||
src.verbs += /client/proc/changeling_deaf_sting
|
||||
src.verbs += /client/proc/changeling_silence_sting
|
||||
src.verbs += /client/proc/changeling_unfat_sting
|
||||
|
||||
*/
|
||||
changeling.changeling_level = 1
|
||||
return
|
||||
|
||||
@@ -17,6 +24,14 @@
|
||||
if(!changeling) changeling = new
|
||||
changeling.host = src
|
||||
|
||||
src.verbs += /datum/changeling/proc/EvolutionMenu
|
||||
|
||||
for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers)
|
||||
if(P.isVerb)
|
||||
if(!(P in src.verbs))
|
||||
src.verbs += P.verbpath
|
||||
|
||||
/*
|
||||
src.verbs += /client/proc/changeling_absorb_dna
|
||||
src.verbs += /client/proc/changeling_transform
|
||||
src.verbs += /client/proc/changeling_lesser_form
|
||||
@@ -30,6 +45,7 @@
|
||||
src.verbs += /client/proc/changeling_unfat_sting
|
||||
src.verbs += /client/proc/changeling_boost_range
|
||||
|
||||
*/
|
||||
changeling.changeling_level = 2
|
||||
if (!changeling.absorbed_dna)
|
||||
changeling.absorbed_dna = list()
|
||||
@@ -43,6 +59,11 @@
|
||||
return
|
||||
|
||||
/mob/proc/remove_changeling_powers()
|
||||
|
||||
for(var/obj/effect/proc_holder/power/P in changeling.purchasedpowers)
|
||||
if(P.isVerb)
|
||||
src.verbs -= P.verbpath
|
||||
/*
|
||||
src.verbs -= /client/proc/changeling_absorb_dna
|
||||
src.verbs -= /client/proc/changeling_transform
|
||||
src.verbs -= /client/proc/changeling_lesser_form
|
||||
@@ -55,7 +76,7 @@
|
||||
src.verbs -= /client/proc/changeling_boost_range
|
||||
src.verbs -= /client/proc/changeling_transformation_sting
|
||||
src.verbs -= /client/proc/changeling_unfat_sting
|
||||
|
||||
*/
|
||||
/client/proc/changeling_absorb_dna()
|
||||
set category = "Changeling"
|
||||
set name = "Absorb DNA"
|
||||
@@ -79,8 +100,8 @@
|
||||
usr << "\red This creature is not compatible with our biology."
|
||||
return
|
||||
|
||||
if (M.mutations & HUSK)
|
||||
usr << "\red This creature has already been drained!"
|
||||
if (M.mutations2 & NOCLONE)
|
||||
usr << "\red This creature's DNA is ruined beyond useability!"
|
||||
return
|
||||
|
||||
if (!G.killing)
|
||||
@@ -127,20 +148,40 @@
|
||||
usr.changeling.absorbed_dna[T.real_name] = T.dna
|
||||
if(usr.nutrition < 400) usr.nutrition = min((usr.nutrition + T.nutrition), 400)
|
||||
usr.changeling.chem_charges += 10
|
||||
usr.changeling.geneticpoints += 2
|
||||
if(T.changeling)
|
||||
if(T.changeling.absorbed_dna)
|
||||
usr.changeling.absorbed_dna |= T.changeling.absorbed_dna //steal all their loot
|
||||
|
||||
T.changeling.absorbed_dna = list()
|
||||
T.changeling.absorbed_dna[T.real_name] = T.dna
|
||||
|
||||
if(T.changeling.purchasedpowers)
|
||||
for(var/obj/effect/proc_holder/power/Tp in T.changeling.purchasedpowers)
|
||||
if(Tp in usr.changeling.purchasedpowers)
|
||||
continue
|
||||
else
|
||||
usr.changeling.purchasedpowers += Tp
|
||||
|
||||
if(!Tp.isVerb)
|
||||
call(Tp.verbpath)()
|
||||
|
||||
else
|
||||
if(usr.changeling.changeling_level == 1)
|
||||
usr.make_lesser_changeling()
|
||||
else
|
||||
usr.make_changeling()
|
||||
|
||||
|
||||
|
||||
|
||||
usr.changeling.chem_charges += T.changeling.chem_charges
|
||||
usr.changeling.geneticpoints += T.changeling.geneticpoints
|
||||
T.changeling.chem_charges = 0
|
||||
usr.changeling.isabsorbing = 0
|
||||
|
||||
T.death(0)
|
||||
T.real_name = "Unknown"
|
||||
M.warn_flavor_changed()
|
||||
T.mutations |= HUSK
|
||||
T.update_body()
|
||||
T.Drain()
|
||||
|
||||
return
|
||||
|
||||
@@ -164,7 +205,7 @@
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) in usr.changeling.absorbed_dna
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in usr.changeling.absorbed_dna
|
||||
|
||||
if (S == null)
|
||||
return
|
||||
@@ -219,9 +260,6 @@
|
||||
if (istype(W, /obj/item/weapon/implant))
|
||||
implants += W
|
||||
|
||||
for(var/obj/item/W in usr)
|
||||
usr.drop_from_slot(W)
|
||||
|
||||
usr.update_clothing()
|
||||
usr.monkeyizing = 1
|
||||
usr.canmove = 0
|
||||
@@ -240,6 +278,10 @@
|
||||
usr.dna = null
|
||||
O.changeling = usr.changeling
|
||||
|
||||
for(var/obj/item/W in usr)
|
||||
usr.drop_from_slot(W)
|
||||
|
||||
|
||||
for(var/obj/T in usr)
|
||||
del(T)
|
||||
//for(var/R in usr.organs) //redundant, let's give garbage collector work to do --rastaf0
|
||||
@@ -263,7 +305,7 @@
|
||||
usr.mind.transfer_to(O)
|
||||
|
||||
O.make_lesser_changeling()
|
||||
|
||||
O.verbs += /client/proc/changeling_lesser_transform
|
||||
del(usr)
|
||||
return
|
||||
|
||||
@@ -304,15 +346,6 @@
|
||||
for (var/obj/item/weapon/implant/I in usr) //Still preserving implants
|
||||
implants += I
|
||||
|
||||
for(var/obj/item/W in usr)
|
||||
usr.u_equip(W)
|
||||
if (usr.client)
|
||||
usr.client.screen -= W
|
||||
if (W)
|
||||
W.loc = usr.loc
|
||||
W.dropped(usr)
|
||||
W.layer = initial(W.layer)
|
||||
|
||||
usr.update_clothing()
|
||||
usr.monkeyizing = 1
|
||||
usr.canmove = 0
|
||||
@@ -326,6 +359,15 @@
|
||||
sleep(48)
|
||||
del(animation)
|
||||
|
||||
for(var/obj/item/W in usr)
|
||||
usr.u_equip(W)
|
||||
if (usr.client)
|
||||
usr.client.screen -= W
|
||||
if (W)
|
||||
W.loc = usr.loc
|
||||
W.dropped(usr)
|
||||
W.layer = initial(W.layer)
|
||||
|
||||
var/mob/living/carbon/human/O = new /mob/living/carbon/human( src )
|
||||
if (isblockon(getblock(usr.dna.uni_identity, 11,3),11))
|
||||
O.gender = FEMALE
|
||||
@@ -471,10 +513,10 @@
|
||||
usr << "\blue We stealthily sting [T]."
|
||||
|
||||
if(!T.changeling)
|
||||
T << "You feel a small prick and a burning sensation in your throat."
|
||||
// T << "You feel a small prick and a burning sensation in your throat."
|
||||
T.silent += 30
|
||||
else
|
||||
T << "You feel a small prick."
|
||||
//else
|
||||
// T << "You feel a small prick."
|
||||
|
||||
usr.verbs -= /client/proc/changeling_silence_sting
|
||||
|
||||
@@ -713,4 +755,210 @@
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_unfat_sting
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
/client/proc/changeling_unstun()
|
||||
set category = "Changeling"
|
||||
set name = "Epinephrine Sacs (25)"
|
||||
set desc = "Removes all stuns"
|
||||
|
||||
if(!usr.changeling)
|
||||
usr << "\red You're not a changeling, something's wrong!"
|
||||
return
|
||||
|
||||
if(usr.changeling.chem_charges < 25)
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
usr.changeling.chem_charges -= 25
|
||||
|
||||
var/mob/living/carbon/human/C = usr
|
||||
|
||||
if(C)
|
||||
C.stat = 0
|
||||
C.SetParalysis(0)
|
||||
C.SetStunned(0)
|
||||
C.SetWeakened(0)
|
||||
C.lying = 0
|
||||
C.canmove = 1
|
||||
|
||||
usr.verbs -= /client/proc/changeling_unstun
|
||||
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_unstun
|
||||
|
||||
|
||||
|
||||
/client/proc/changeling_fastchemical()
|
||||
|
||||
usr.changeling.chem_recharge_multiplier = usr.changeling.chem_recharge_multiplier*2
|
||||
|
||||
/client/proc/changeling_engorgedglands()
|
||||
|
||||
usr.changeling.chem_storage = usr.changeling.chem_storage+25
|
||||
|
||||
/client/proc/changeling_digitalcamo()
|
||||
set category = "Changeling"
|
||||
set name = "Toggle Digital Camoflague (10)"
|
||||
set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
|
||||
|
||||
if(!usr.changeling)
|
||||
usr << "\red You're not a changeling, something's wrong!"
|
||||
return
|
||||
|
||||
if(usr.changeling.chem_charges < 10)
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
usr.changeling.chem_charges -= 10
|
||||
|
||||
var/mob/living/carbon/human/C = usr
|
||||
|
||||
if(C)
|
||||
C << "[C.digitalcamo ? "We return to normal." : "We distort our form."]"
|
||||
C.digitalcamo = !C.digitalcamo
|
||||
spawn(0)
|
||||
while(C && C.digitalcamo)
|
||||
C.changeling.chem_charges -= 1/4
|
||||
sleep(10)
|
||||
|
||||
|
||||
usr.verbs -= /client/proc/changeling_digitalcamo
|
||||
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_digitalcamo
|
||||
|
||||
|
||||
/client/proc/changeling_DEATHsting()
|
||||
set category = "Changeling"
|
||||
set name = "Death Sting (40)"
|
||||
set desc = "Causes spasms onto death."
|
||||
|
||||
if(!usr.changeling)
|
||||
usr << "\red You're not a changeling, something's wrong!"
|
||||
return
|
||||
|
||||
var/list/victims = list()
|
||||
for(var/mob/living/carbon/C in oview(usr.changeling.sting_range))
|
||||
victims += C
|
||||
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
|
||||
|
||||
if(T && T in view(usr.changeling.sting_range))
|
||||
|
||||
if(usr.stat)
|
||||
usr << "\red Not when we are incapacitated."
|
||||
return
|
||||
|
||||
if(usr.changeling.chem_charges < 40)
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
usr.changeling.chem_charges -= 40
|
||||
usr.changeling.sting_range = 1
|
||||
|
||||
usr << "\blue We stealthily sting [T]."
|
||||
|
||||
if(!T.changeling)
|
||||
T << "You feel a small prick and your chest becomes tight."
|
||||
|
||||
T.silent = (10)
|
||||
T.Paralyse(10)
|
||||
T.make_jittery(1000)
|
||||
|
||||
if (T.reagents)
|
||||
T.reagents.add_reagent("lexorin", 40)
|
||||
|
||||
else
|
||||
T << "You feel a small prick."
|
||||
|
||||
usr.verbs -= /client/proc/changeling_DEATHsting
|
||||
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_DEATHsting
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
/client/proc/changeling_rapidregen()
|
||||
set category = "Changeling"
|
||||
set name = "Rapid Regeneration (30)"
|
||||
set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
|
||||
|
||||
if(!usr.changeling)
|
||||
usr << "\red You're not a changeling, something's wrong!"
|
||||
return
|
||||
|
||||
if(usr.changeling.chem_charges < 30)
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
usr.changeling.chem_charges -= 30
|
||||
|
||||
var/mob/living/carbon/human/C = usr
|
||||
|
||||
spawn(0)
|
||||
for(var/i = 0, i<10,i++)
|
||||
if(C)
|
||||
C.adjustBruteLoss(-10)
|
||||
C.adjustToxLoss(-10)
|
||||
C.adjustOxyLoss(-10)
|
||||
C.adjustFireLoss(-10)
|
||||
sleep(10)
|
||||
|
||||
|
||||
usr.verbs -= /client/proc/changeling_rapidregen
|
||||
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_rapidregen
|
||||
|
||||
|
||||
|
||||
|
||||
/client/proc/changeling_lsdsting()
|
||||
set category = "Changeling"
|
||||
set name = "Hallucination Sting (15)"
|
||||
set desc = "Causes terror in the target."
|
||||
|
||||
if(!usr.changeling)
|
||||
usr << "\red You're not a changeling, something's wrong!"
|
||||
return
|
||||
|
||||
var/list/victims = list()
|
||||
for(var/mob/living/carbon/C in oview(usr.changeling.sting_range))
|
||||
victims += C
|
||||
var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims
|
||||
|
||||
if(T && T in view(usr.changeling.sting_range))
|
||||
|
||||
if(usr.stat)
|
||||
usr << "\red Not when we are incapacitated."
|
||||
return
|
||||
|
||||
if(usr.changeling.chem_charges < 15)
|
||||
usr << "\red We don't have enough stored chemicals to do that!"
|
||||
return
|
||||
|
||||
usr.changeling.chem_charges -= 15
|
||||
usr.changeling.sting_range = 1
|
||||
|
||||
usr << "\blue We stealthily sting [T]."
|
||||
|
||||
if(!T.changeling)
|
||||
// T << "You feel a small prick." // No warning.
|
||||
|
||||
var/timer = rand(300,600)
|
||||
|
||||
spawn(timer)
|
||||
if(T)
|
||||
if(T.reagents)
|
||||
// T.reagents.add_reagent("LSD", 50) // Slight overkill, it seems.
|
||||
T.hallucination = 400
|
||||
|
||||
|
||||
usr.verbs -= /client/proc/changeling_lsdsting
|
||||
|
||||
spawn(5)
|
||||
usr.verbs += /client/proc/changeling_lsdsting
|
||||
|
||||
return
|
||||
520
code/game/gamemodes/changeling/modularchangling.dm
Normal file
520
code/game/gamemodes/changeling/modularchangling.dm
Normal file
@@ -0,0 +1,520 @@
|
||||
|
||||
var/list/powers = typesof(/obj/effect/proc_holder/power) //needed for the badmin verb for now
|
||||
var/list/obj/effect/proc_holder/power/powerinstances = list()
|
||||
|
||||
/obj/effect/proc_holder/power
|
||||
name = "Power"
|
||||
desc = "Placeholder"
|
||||
density = 0
|
||||
opacity = 0
|
||||
|
||||
var/helptext = ""
|
||||
|
||||
var/allowduringlesserform = 0
|
||||
var/isVerb = 1 // Is it an active power, or passive?
|
||||
var/verbpath = null // Path to a verb that contains the effects.
|
||||
var/genomecost = 500000 // Cost for the changling to evolve this power.
|
||||
|
||||
/obj/effect/proc_holder/power/absorb_dna
|
||||
name = "Absorb DNA"
|
||||
desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger."
|
||||
genomecost = 0
|
||||
|
||||
verbpath = /client/proc/changeling_absorb_dna
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/transform
|
||||
name = "Transform"
|
||||
desc = "We take on the apperance and voice of one we have absorbed."
|
||||
genomecost = 0
|
||||
|
||||
verbpath = /client/proc/changeling_transform
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/lesser_form
|
||||
name = "Lesser Form"
|
||||
desc = "We debase ourselves and become lesser. We become a monkey."
|
||||
genomecost = 1
|
||||
|
||||
verbpath = /client/proc/changeling_lesser_form
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/changeling_greater_form
|
||||
name = "Greater Form"
|
||||
desc = "We become the pinnicle of evolution. We will show the humans what happens when they leave their isle of ignorance."
|
||||
genomecost = 250
|
||||
|
||||
// doesn't happen lol. Yet!
|
||||
|
||||
/obj/effect/proc_holder/power/fakedeath
|
||||
name = "Fake Death"
|
||||
desc = "We fake our death while we heal."
|
||||
genomecost = 0
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_fakedeath
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/deaf_sting
|
||||
name = "Deaf Sting"
|
||||
desc = "We silently sting a human, completely silencing them for a short time."
|
||||
genomecost = 1
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_deaf_sting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/blind_sting
|
||||
name = "Blind Sting"
|
||||
desc = "We silently sting a human, completely deafening them for a short time."
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_blind_sting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/paralysis_sting
|
||||
name = "Paralysis Sting"
|
||||
desc = "We silently sting a human, paralyzing them for a short time. We must be wary, they can still whisper."
|
||||
genomecost = 5
|
||||
|
||||
|
||||
verbpath = /client/proc/changeling_paralysis_sting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/silence_sting
|
||||
name = "Silence Sting"
|
||||
desc = "We silently sting a human, completely silencing them for a short time."
|
||||
helptext = "Does not provide a warning to a victim that they've been stung, until they try to speak and can't." // Man, fuck javascript. ' == '
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_silence_sting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/transformation_sting
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
|
||||
genomecost = 2
|
||||
|
||||
verbpath = /client/proc/changeling_transformation_sting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/unfat_sting
|
||||
name = "Unfat Sting"
|
||||
desc = "We silently sting a human, forcing them to rapidly metobolize their fat."
|
||||
genomecost = 1
|
||||
|
||||
|
||||
verbpath = /client/proc/changeling_unfat_sting
|
||||
|
||||
/obj/effect/proc_holder/power/boost_range
|
||||
name = "Boost Range"
|
||||
desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
|
||||
genomecost = 2
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_boost_range
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/Epinephrine
|
||||
name = "Epinephrine sacs"
|
||||
desc = "We evolve additional sacs of adrenaline throughout our body."
|
||||
helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
|
||||
genomecost = 4
|
||||
|
||||
verbpath = /client/proc/changeling_unstun
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/ChemicalSynth
|
||||
name = "Rapid Chemical Synthesis"
|
||||
desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
|
||||
helptext = "Doubles the rate at which we naturally recharge chemicals."
|
||||
genomecost = 4
|
||||
isVerb = 0
|
||||
|
||||
verbpath = /client/proc/changeling_fastchemical
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/EngorgedGlands
|
||||
name = "Engorged Chemical Glands"
|
||||
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
|
||||
helptext = "Allows us to store an extra 25 units of chemicals."
|
||||
genomecost = 4
|
||||
isVerb = 0
|
||||
|
||||
|
||||
verbpath = /client/proc/changeling_engorgedglands
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/DigitalCamoflague
|
||||
name = "Digital Camoflauge"
|
||||
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
|
||||
genomecost = 4
|
||||
allowduringlesserform = 1
|
||||
|
||||
verbpath = /client/proc/changeling_digitalcamo
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/DeathSting
|
||||
name = "Death Sting"
|
||||
desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured."
|
||||
genomecost = 10
|
||||
|
||||
verbpath = /client/proc/changeling_DEATHsting
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/power/rapidregeneration
|
||||
name = "Rapid Regeneration"
|
||||
desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
|
||||
helptext = "Heals a moderate amount of damage every tick."
|
||||
genomecost = 8
|
||||
|
||||
verbpath = /client/proc/changeling_rapidregen
|
||||
|
||||
/obj/effect/proc_holder/power/LSDSting
|
||||
name = "Hallucination Sting"
|
||||
desc = "We evolve the ability to sting a target with a powerful hallunicationary chemical."
|
||||
helptext = "The target does not notice they've been stung. The effect occurs after 30 to 60 seconds."
|
||||
genomecost = 3
|
||||
|
||||
verbpath = /client/proc/changeling_lsdsting
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Modularchangling, totally stolen from the new player panel. YAYY
|
||||
/datum/changeling/proc/EvolutionMenu()//The new one
|
||||
set category = "Changeling"
|
||||
set desc = "Level up!"
|
||||
if (!usr.changeling)
|
||||
return
|
||||
|
||||
src = usr.changeling
|
||||
|
||||
if(!powerinstances.len)
|
||||
for(var/P in powers)
|
||||
var/obj/effect/proc_holder/power/nP = new P
|
||||
if (nP.desc == "Placeholder")
|
||||
del(nP)
|
||||
continue
|
||||
powerinstances += nP
|
||||
|
||||
var/dat = "<html><head><title>Changling Evolution Menu</title></head>"
|
||||
|
||||
//javascript, the part that does most of the work~
|
||||
dat += {"
|
||||
|
||||
<head>
|
||||
<script type='text/javascript'>
|
||||
|
||||
var locked_tabs = new Array();
|
||||
|
||||
function updateSearch(){
|
||||
|
||||
|
||||
var filter_text = document.getElementById('filter');
|
||||
var filter = filter_text.value.toLowerCase();
|
||||
|
||||
if(complete_list != null && complete_list != ""){
|
||||
var mtbl = document.getElementById("maintable_data_archive");
|
||||
mtbl.innerHTML = complete_list;
|
||||
}
|
||||
|
||||
if(filter.value == ""){
|
||||
return;
|
||||
}else{
|
||||
|
||||
var maintable_data = document.getElementById('maintable_data');
|
||||
var ltr = maintable_data.getElementsByTagName("tr");
|
||||
for ( var i = 0; i < ltr.length; ++i )
|
||||
{
|
||||
try{
|
||||
var tr = ltr\[i\];
|
||||
if(tr.getAttribute("id").indexOf("data") != 0){
|
||||
continue;
|
||||
}
|
||||
var ltd = tr.getElementsByTagName("td");
|
||||
var td = ltd\[0\];
|
||||
var lsearch = td.getElementsByTagName("b");
|
||||
var search = lsearch\[0\];
|
||||
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
|
||||
//document.write("<p>"+search.innerText+"<br>"+filter+"<br>"+search.innerText.indexOf(filter))
|
||||
if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
|
||||
{
|
||||
//document.write("a");
|
||||
//ltr.removeChild(tr);
|
||||
td.innerHTML = "";
|
||||
i--;
|
||||
}
|
||||
}catch(err) { }
|
||||
}
|
||||
}
|
||||
|
||||
var count = 0;
|
||||
var index = -1;
|
||||
var debug = document.getElementById("debug");
|
||||
|
||||
locked_tabs = new Array();
|
||||
|
||||
}
|
||||
|
||||
function expand(id,name,desc,helptext,power,ownsthis){
|
||||
|
||||
clearAll();
|
||||
|
||||
var span = document.getElementById(id);
|
||||
|
||||
body = "<table><tr><td>";
|
||||
|
||||
body += "</td><td align='center'>";
|
||||
|
||||
body += "<font size='2'><b>"+desc+"</b></font> <BR>"
|
||||
|
||||
body += "<font size='2'><font color = 'red'><b>"+helptext+"</b></font> <BR>"
|
||||
|
||||
if(!ownsthis)
|
||||
{
|
||||
body += "<a href='?src=\ref[src];P="+power+"'>Evolve</a>"
|
||||
}
|
||||
|
||||
body += "</td><td align='center'>";
|
||||
|
||||
body += "</td></tr></table>";
|
||||
|
||||
|
||||
span.innerHTML = body
|
||||
}
|
||||
|
||||
function clearAll(){
|
||||
var spans = document.getElementsByTagName('span');
|
||||
for(var i = 0; i < spans.length; i++){
|
||||
var span = spans\[i\];
|
||||
|
||||
var id = span.getAttribute("id");
|
||||
|
||||
if(!(id.indexOf("item")==0))
|
||||
continue;
|
||||
|
||||
var pass = 1;
|
||||
|
||||
for(var j = 0; j < locked_tabs.length; j++){
|
||||
if(locked_tabs\[j\]==id){
|
||||
pass = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(pass != 1)
|
||||
continue;
|
||||
|
||||
|
||||
|
||||
|
||||
span.innerHTML = "";
|
||||
}
|
||||
}
|
||||
|
||||
function addToLocked(id,link_id,notice_span_id){
|
||||
var link = document.getElementById(link_id);
|
||||
var decision = link.getAttribute("name");
|
||||
if(decision == "1"){
|
||||
link.setAttribute("name","2");
|
||||
}else{
|
||||
link.setAttribute("name","1");
|
||||
removeFromLocked(id,link_id,notice_span_id);
|
||||
return;
|
||||
}
|
||||
|
||||
var pass = 1;
|
||||
for(var j = 0; j < locked_tabs.length; j++){
|
||||
if(locked_tabs\[j\]==id){
|
||||
pass = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!pass)
|
||||
return;
|
||||
locked_tabs.push(id);
|
||||
var notice_span = document.getElementById(notice_span_id);
|
||||
notice_span.innerHTML = "<font color='red'>Locked</font> ";
|
||||
//link.setAttribute("onClick","attempt('"+id+"','"+link_id+"','"+notice_span_id+"');");
|
||||
//document.write("removeFromLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
|
||||
//document.write("aa - "+link.getAttribute("onClick"));
|
||||
}
|
||||
|
||||
function attempt(ab){
|
||||
return ab;
|
||||
}
|
||||
|
||||
function removeFromLocked(id,link_id,notice_span_id){
|
||||
//document.write("a");
|
||||
var index = 0;
|
||||
var pass = 0;
|
||||
for(var j = 0; j < locked_tabs.length; j++){
|
||||
if(locked_tabs\[j\]==id){
|
||||
pass = 1;
|
||||
index = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!pass)
|
||||
return;
|
||||
locked_tabs\[index\] = "";
|
||||
var notice_span = document.getElementById(notice_span_id);
|
||||
notice_span.innerHTML = "";
|
||||
//var link = document.getElementById(link_id);
|
||||
//link.setAttribute("onClick","addToLocked('"+id+"','"+link_id+"','"+notice_span_id+"')");
|
||||
}
|
||||
|
||||
function selectTextField(){
|
||||
var filter_text = document.getElementById('filter');
|
||||
filter_text.focus();
|
||||
filter_text.select();
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
|
||||
|
||||
"}
|
||||
|
||||
//body tag start + onload and onkeypress (onkeyup) javascript event calls
|
||||
dat += "<body onload='selectTextField(); updateSearch();' onkeyup='updateSearch();'>"
|
||||
|
||||
//title + search bar
|
||||
dat += {"
|
||||
|
||||
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable'>
|
||||
<tr id='title_tr'>
|
||||
<td align='center'>
|
||||
<font size='5'><b>Changling Evolution Menu</b></font><br>
|
||||
Hover over a power to see more information<br>
|
||||
Current genomes left to evolve with: [usr.changeling.geneticpoints]
|
||||
<p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id='search_tr'>
|
||||
<td align='center'>
|
||||
<b>Search:</b> <input type='text' id='filter' value='' style='width:300px;'>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
"}
|
||||
|
||||
//player table header
|
||||
dat += {"
|
||||
<span id='maintable_data_archive'>
|
||||
<table width='560' align='center' cellspacing='0' cellpadding='5' id='maintable_data'>"}
|
||||
|
||||
var/i = 1
|
||||
for(var/obj/effect/proc_holder/power/P in powerinstances)
|
||||
var/ownsthis = 0
|
||||
|
||||
if(P in usr.changeling.purchasedpowers)
|
||||
ownsthis = 1
|
||||
|
||||
|
||||
var/color = "#e6e6e6"
|
||||
if(i%2 == 0)
|
||||
color = "#f2f2f2"
|
||||
|
||||
|
||||
dat += {"
|
||||
|
||||
<tr id='data[i]' name='[i]' onClick="addToLocked('item[i]','data[i]','notice_span[i]')">
|
||||
<td align='center' bgcolor='[color]'>
|
||||
<span id='notice_span[i]'></span>
|
||||
<a id='link[i]'
|
||||
onmouseover='expand("item[i]","[P.name]","[P.desc]","[P.helptext]","[P]",[ownsthis])'
|
||||
>
|
||||
<b id='search[i]'>Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]</b>
|
||||
</a>
|
||||
<br><span id='item[i]'></span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
"}
|
||||
|
||||
i++
|
||||
|
||||
|
||||
//player table ending
|
||||
dat += {"
|
||||
</table>
|
||||
</span>
|
||||
|
||||
<script type='text/javascript'>
|
||||
var maintable = document.getElementById("maintable_data_archive");
|
||||
var complete_list = maintable.innerHTML;
|
||||
</script>
|
||||
</body></html>
|
||||
"}
|
||||
|
||||
usr << browse(dat, "window=powers;size=900x480")
|
||||
|
||||
|
||||
/datum/changeling/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if(href_list["P"])
|
||||
usr.changeling.purchasePower(href_list["P"])
|
||||
call(/datum/changeling/proc/EvolutionMenu)()
|
||||
|
||||
|
||||
|
||||
/datum/changeling/proc/purchasePower(var/obj/effect/proc_holder/power/Pname)
|
||||
if (!usr.changeling)
|
||||
return
|
||||
|
||||
var/obj/effect/proc_holder/power/Thepower = null
|
||||
|
||||
for (var/obj/effect/proc_holder/power/P in powerinstances)
|
||||
if(P.name == Pname)
|
||||
Thepower = P
|
||||
break
|
||||
|
||||
if(Thepower == null)
|
||||
usr << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
|
||||
return
|
||||
|
||||
if(Thepower in usr.changeling.purchasedpowers)
|
||||
usr << "We have already evolved this ability!"
|
||||
return
|
||||
|
||||
|
||||
if(usr.changeling.geneticpoints < Thepower.genomecost)
|
||||
usr << "We cannot evolve this... yet. We must acquire more DNA."
|
||||
return
|
||||
|
||||
usr.changeling.geneticpoints -= Thepower.genomecost
|
||||
|
||||
usr.changeling.purchasedpowers += Thepower
|
||||
|
||||
if(!Thepower.isVerb)
|
||||
call(Thepower.verbpath)()
|
||||
|
||||
else
|
||||
if(usr.changeling.changeling_level == 1)
|
||||
usr.make_lesser_changeling()
|
||||
else
|
||||
usr.make_changeling()
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
required_players = 3
|
||||
required_enemies = 3
|
||||
recommended_enemies = 4
|
||||
|
||||
var/datum/mind/sacrifice_target = null
|
||||
var/finished = 0
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
// Enable this and the below to have command reports in extended
|
||||
// var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
|
||||
// var/const/waittime_h = 1800
|
||||
|
||||
/datum/game_mode/announce()
|
||||
world << "<B>The current game mode is - Extended Role-Playing!</B>"
|
||||
world << "<B>Just have fun and role-play!</B>"
|
||||
@@ -14,3 +18,9 @@
|
||||
// setup_sectors()
|
||||
// spawn_exporation_packs()
|
||||
return 1
|
||||
|
||||
// Enable this and the above to have command reports in extended
|
||||
///datum/game_mode/extended/post_setup()
|
||||
// send_intercept()
|
||||
//
|
||||
// ..()
|
||||
@@ -20,9 +20,11 @@
|
||||
station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
|
||||
explosion_in_progress = 0 //sit back and relax
|
||||
list/datum/mind/modePlayer = new
|
||||
list/restricted_jobs = list()
|
||||
list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist
|
||||
list/protected_jobs = list() // Jobs that can't be tratiors because
|
||||
required_players = 0
|
||||
required_enemies = 0
|
||||
recommended_enemies = 0
|
||||
uplink_welcome
|
||||
uplink_uses
|
||||
uplink_items = {"Highly Visible and Dangerous Weapons;
|
||||
@@ -71,7 +73,11 @@ Badassery;
|
||||
/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);
|
||||
Whitespace:Seperator;"}
|
||||
|
||||
//obj/item/weapon/syndie/c4explosive/heavy:7:High (!) Power Explosive Charge, with Detonator;
|
||||
// Items removed from above:
|
||||
/*
|
||||
/obj/item/weapon/syndie/c4explosive/heavy:7:High (!) Power Explosive Charge, with Detonator;
|
||||
/obj/item/weapon/cloaking_device:4:Cloaking Device; //Replacing cloakers with thermals. -Pete
|
||||
*/
|
||||
|
||||
/datum/game_mode/proc/announce() //to be calles when round starts
|
||||
world << "<B>Notice</B>: [src] did not define announce()"
|
||||
@@ -120,6 +126,72 @@ Whitespace:Seperator;"}
|
||||
|
||||
|
||||
/datum/game_mode/proc/declare_completion()
|
||||
var/clients = 0
|
||||
var/surviving_humans = 0
|
||||
var/surviving_total = 0
|
||||
var/ghosts = 0
|
||||
var/escaped_humans = 0
|
||||
var/escaped_total = 0
|
||||
var/escaped_on_pod_1 = 0
|
||||
var/escaped_on_pod_2 = 0
|
||||
var/escaped_on_pod_3 = 0
|
||||
var/escaped_on_pod_5 = 0
|
||||
var/escaped_on_shuttle = 0
|
||||
|
||||
var/list/area/escape_locations = list(/area/shuttle/escape/centcom, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom)
|
||||
|
||||
for(var/mob/M in world)
|
||||
if(M.client)
|
||||
clients++
|
||||
if(ishuman(M))
|
||||
if(!M.stat)
|
||||
surviving_humans++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
escaped_humans++
|
||||
if(!M.stat)
|
||||
surviving_total++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type in escape_locations)
|
||||
escaped_total++
|
||||
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape/centcom)
|
||||
escaped_on_shuttle++
|
||||
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod1/centcom)
|
||||
escaped_on_pod_1++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod2/centcom)
|
||||
escaped_on_pod_2++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod3/centcom)
|
||||
escaped_on_pod_3++
|
||||
if(M.loc && M.loc.loc && M.loc.loc.type == /area/shuttle/escape_pod5/centcom)
|
||||
escaped_on_pod_5++
|
||||
|
||||
if(isobserver(M))
|
||||
ghosts++
|
||||
|
||||
if(clients > 0)
|
||||
feedback_set("round_end_clients",clients)
|
||||
if(ghosts > 0)
|
||||
feedback_set("round_end_ghosts",ghosts)
|
||||
if(surviving_humans > 0)
|
||||
feedback_set("survived_human",surviving_humans)
|
||||
if(surviving_total > 0)
|
||||
feedback_set("survived_total",surviving_total)
|
||||
if(escaped_humans > 0)
|
||||
feedback_set("escaped_human",escaped_humans)
|
||||
if(escaped_total > 0)
|
||||
feedback_set("escaped_total",escaped_total)
|
||||
if(escaped_on_shuttle > 0)
|
||||
feedback_set("escaped_on_shuttle",escaped_on_shuttle)
|
||||
if(escaped_on_pod_1 > 0)
|
||||
feedback_set("escaped_on_pod_1",escaped_on_pod_1)
|
||||
if(escaped_on_pod_2 > 0)
|
||||
feedback_set("escaped_on_pod_2",escaped_on_pod_2)
|
||||
if(escaped_on_pod_3 > 0)
|
||||
feedback_set("escaped_on_pod_3",escaped_on_pod_3)
|
||||
if(escaped_on_pod_5 > 0)
|
||||
feedback_set("escaped_on_pod_5",escaped_on_pod_5)
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@@ -169,23 +241,79 @@ Whitespace:Seperator;"}
|
||||
|
||||
/datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=1)
|
||||
var/list/candidates = list()
|
||||
var/list/drafted = list()
|
||||
var/datum/mind/applicant = null
|
||||
|
||||
var/roletext
|
||||
switch(role)
|
||||
if(BE_CHANGELING) roletext="changeling"
|
||||
if(BE_TRAITOR) roletext="traitor"
|
||||
if(BE_OPERATIVE) roletext="operative"
|
||||
if(BE_WIZARD) roletext="wizard"
|
||||
if(BE_REV) roletext="revolutionary"
|
||||
if(BE_CULTIST) roletext="cultist"
|
||||
|
||||
|
||||
for(var/mob/new_player/player in world)
|
||||
if(player.client && player.ready)
|
||||
if(player.preferences.be_special & role)
|
||||
if(!jobban_isbanned(player, "Syndicate"))
|
||||
candidates += player.mind
|
||||
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
|
||||
candidates += player.mind // Get a list of all the people who want to be the antagonist for this round
|
||||
|
||||
if(candidates.len < required_enemies)
|
||||
if(restricted_jobs)
|
||||
for(var/datum/mind/player in candidates)
|
||||
for(var/job in restricted_jobs) // Remove people who want to be antagonist but have a job already that precludes it
|
||||
if(player.assigned_role == job)
|
||||
candidates -= player
|
||||
|
||||
if(candidates.len < recommended_enemies)
|
||||
for(var/mob/new_player/player in world)
|
||||
if (player.client && player.ready)
|
||||
if(!jobban_isbanned(player, "Syndicate"))
|
||||
candidates += player.mind
|
||||
if(!(player.preferences.be_special & role)) // We don't have enough people who want to be antagonist, make a seperate list of people who don't want to be one
|
||||
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
|
||||
drafted += player.mind
|
||||
|
||||
if(candidates.len < required_enemies && override_jobbans) //just to be safe. Ignored jobbans are better than broken round. Shouldn't happen usually. --rastaf0
|
||||
if(restricted_jobs)
|
||||
for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist
|
||||
for(var/job in restricted_jobs)
|
||||
if(player.assigned_role == job)
|
||||
drafted -= player
|
||||
|
||||
while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates
|
||||
if(drafted.len > 0)
|
||||
applicant = pick(drafted)
|
||||
if(applicant)
|
||||
candidates += applicant
|
||||
drafted.Remove(applicant)
|
||||
|
||||
else // Not enough scrubs, ABORT ABORT ABORT
|
||||
break
|
||||
|
||||
if(candidates.len < recommended_enemies && override_jobbans) //If we still don't have enough people, we're going to start drafting banned people.
|
||||
for(var/mob/new_player/player in world)
|
||||
if (player.client && player.ready)
|
||||
candidates += player.mind
|
||||
return candidates
|
||||
if(jobban_isbanned(player, "Syndicate") || jobban_isbanned(player, roletext)) //Nodrak/Carn: Antag Job-bans
|
||||
drafted += player.mind
|
||||
|
||||
if(restricted_jobs)
|
||||
for(var/datum/mind/player in drafted) // Remove people who can't be an antagonist
|
||||
for(var/job in restricted_jobs)
|
||||
if(player.assigned_role == job)
|
||||
drafted -= player
|
||||
|
||||
while(candidates.len < recommended_enemies) // Pick randomlly just the number of people we need and add them to our list of candidates
|
||||
if(drafted.len > 0)
|
||||
applicant = pick(drafted)
|
||||
if(applicant)
|
||||
candidates += applicant
|
||||
drafted.Remove(applicant)
|
||||
|
||||
else // Not enough scrubs, ABORT ABORT ABORT
|
||||
break
|
||||
|
||||
return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than recommended_enemies
|
||||
// recommended_enemies if the number of people with that role set to yes is less than recomended_enemies,
|
||||
// Less if there are not enough valid players in the game entirely to make recommended_enemies.
|
||||
|
||||
|
||||
/datum/game_mode/proc/check_player_role_pref(var/role, var/mob/new_player/player)
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
config_tag = "malfunction"
|
||||
required_players = 1
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
|
||||
uplink_welcome = "Crazy AI Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
var/const/waittime_l = 600
|
||||
var/const/waittime_h = 1800 // started at 1800
|
||||
|
||||
@@ -15,9 +20,6 @@
|
||||
var/to_nuke_or_not_to_nuke = 0
|
||||
var/apcs = 0 //Adding dis to track how many APCs the AI hacks. --NeoFite
|
||||
|
||||
uplink_welcome = "Crazy AI Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
|
||||
/datum/game_mode/malfunction/announce()
|
||||
world << "<B>The current game mode is - AI Malfunction!</B>"
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
uplink_welcome = "EVIL METEOR Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
|
||||
/datum/game_mode/meteor/announce()
|
||||
world << "<B>The current game mode is - Meteor!</B>"
|
||||
world << "<B>The space station has been stuck in a major meteor shower. You must escape from the station or at least live.</B>"
|
||||
@@ -38,6 +39,7 @@
|
||||
/datum/game_mode/meteor/declare_completion()
|
||||
var/list/survivors = list()
|
||||
var/area/escape_zone = locate(/area/shuttle/escape/centcom)
|
||||
var/area/pod_zone = list( /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom )
|
||||
|
||||
for(var/mob/living/player in world)
|
||||
if (player.client)
|
||||
@@ -45,6 +47,8 @@
|
||||
var/turf/location = get_turf(player.loc)
|
||||
if (location in escape_zone)
|
||||
survivors[player.real_name] = "shuttle"
|
||||
else if (location.loc.type in pod_zone)
|
||||
survivors[player.real_name] = "pod"
|
||||
else
|
||||
survivors[player.real_name] = "alive"
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
config_tag = "nuclear"
|
||||
required_players = 3
|
||||
required_enemies = 2
|
||||
recommended_enemies = 5
|
||||
|
||||
uplink_welcome = "Corporate Backed Uplink Console:"
|
||||
uplink_uses = 40
|
||||
@@ -29,6 +30,7 @@
|
||||
/datum/game_mode/nuclear/can_start()//This could be better, will likely have to recode it later
|
||||
if(!..())
|
||||
return 0
|
||||
|
||||
var/list/possible_syndicates = get_players_for_role(BE_OPERATIVE)
|
||||
var/agent_number = 0
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
required_players = 3
|
||||
required_enemies = 3
|
||||
recommended_enemies = 3
|
||||
|
||||
|
||||
uplink_welcome = "Revolutionary Uplink Console:"
|
||||
uplink_uses = 10
|
||||
@@ -133,7 +135,7 @@
|
||||
if (!where)
|
||||
mob << "The Syndicate were unfortunately unable to get you a flash."
|
||||
else
|
||||
mob << "The flash in your [where] would help you to use your extreme persuasion skills."
|
||||
mob << "The flash in your [where] will implant a memory engram to convert others to our cause."
|
||||
return 1
|
||||
|
||||
//////////////////////////////////////
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
restricted_jobs = list("Cyborg", "AI")//Approved by headmins for a week test, if you see this it would be nice if you didn't spread it everywhere
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 4
|
||||
|
||||
|
||||
uplink_welcome = "Syndicate Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
config_tag = "wizard"
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
|
||||
uplink_welcome = "Wizardly Uplink Console:"
|
||||
uplink_uses = 10
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#define ui_belt "SOUTH-1,3"
|
||||
#define ui_throw "SOUTH-1,8"
|
||||
#define ui_oxygen "EAST+1, NORTH-4"
|
||||
#define ui_pressure "EAST+1, NORTH-5"
|
||||
#define ui_toxin "EAST+1, NORTH-6"
|
||||
#define ui_internal "EAST+1, NORTH-2"
|
||||
#define ui_fire "EAST+1, NORTH-8"
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
dat += text("[]\t-Burn Severity %: []</FONT><BR>", (occupant.getFireLoss() < 60 ? "<font color='blue'>" : "<font color='red'>"), occupant.getFireLoss())
|
||||
dat += text("<HR>Paralysis Summary %: [] ([] seconds left!)<BR>", occupant.paralysis, round(occupant.paralysis / 4))
|
||||
dat += text("Inaprovaline units: [] units<BR>", occupant.reagents.get_reagent_amount("inaprovaline"))
|
||||
dat += text("Soporific: [] units<BR>", occupant.reagents.get_reagent_amount("stoxin"))
|
||||
dat += text("Soporific (Sleep Toxin): [] units<BR>", occupant.reagents.get_reagent_amount("stoxin"))
|
||||
dat += text("[]\tDermaline: [] units</FONT><BR>", (occupant.reagents.get_reagent_amount("dermaline") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("dermaline"))
|
||||
dat += text("[]\tBicaridine: [] units<BR>", (occupant.reagents.get_reagent_amount("bicaridine") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("bicaridine"))
|
||||
dat += text("[]\tDexalin: [] units<BR>", (occupant.reagents.get_reagent_amount("dexalin") < 30 ? "<font color='black'>" : "<font color='red'>"), occupant.reagents.get_reagent_amount("dexalin"))
|
||||
|
||||
@@ -1,3 +1,26 @@
|
||||
|
||||
/proc/RandomAAlarmWires()
|
||||
//to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else).
|
||||
var/list/AAlarmwires = list(0, 0, 0, 0, 0)
|
||||
AAlarmIndexToFlag = list(0, 0, 0, 0, 0)
|
||||
AAlarmIndexToWireColor = list(0, 0, 0, 0, 0)
|
||||
AAlarmWireColorToIndex = list(0, 0, 0, 0, 0)
|
||||
var/flagIndex = 1
|
||||
for (var/flag=1, flag<32, flag+=flag)
|
||||
var/valid = 0
|
||||
while (!valid)
|
||||
var/colorIndex = rand(1, 5)
|
||||
if (AAlarmwires[colorIndex]==0)
|
||||
valid = 1
|
||||
AAlarmwires[colorIndex] = flag
|
||||
AAlarmIndexToFlag[flagIndex] = flag
|
||||
AAlarmIndexToWireColor[flagIndex] = colorIndex
|
||||
AAlarmWireColorToIndex[colorIndex] = flagIndex
|
||||
flagIndex+=1
|
||||
return AAlarmwires
|
||||
|
||||
|
||||
|
||||
// A datum for dealing with threshold limit values
|
||||
// used in /obj/machinery/alarm
|
||||
/datum/tlv
|
||||
@@ -49,6 +72,19 @@
|
||||
#define AALARM_REPORT_TIMEOUT 100
|
||||
var/datum/radio_frequency/radio_connection
|
||||
var/locked = 1
|
||||
var/wiresexposed = 0 // If it's been screwdrivered open.
|
||||
var/aidisabled = 0
|
||||
var/AAlarmwires = 31
|
||||
var/shorted = 0
|
||||
|
||||
// Uses code from apc.dm
|
||||
|
||||
#define AALARM_WIRE_IDSCAN 1 //Added wires
|
||||
#define AALARM_WIRE_POWER 2
|
||||
#define AALARM_WIRE_SYPHON 3
|
||||
#define AALARM_WIRE_AI_CONTROL 4
|
||||
#define AALARM_WIRE_AALARM 5
|
||||
|
||||
|
||||
#define AALARM_MODE_SCRUBBING 1
|
||||
#define AALARM_MODE_VENTING 2 //makes draught
|
||||
@@ -89,8 +125,18 @@
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.20,ONE_ATMOSPHERE*0.35,ONE_ATMOSPHERE*0.8,ONE_ATMOSPHERE*0.9), /* kpa */
|
||||
"temperature" = new/datum/tlv(40, 60, 150, 160), // K
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60), /* kpa */
|
||||
"temperature" = new/datum/tlv(40, 60, 100, 120), // K
|
||||
)
|
||||
|
||||
/obj/machinery/alarm/kitchen_cold_room
|
||||
TLV = list(
|
||||
"oxygen" = new/datum/tlv( 16, 19, 135, 140), // Partial pressure, kpa
|
||||
"carbon dioxide" = new/datum/tlv(-1.0, -1.0, 5, 10), // Partial pressure, kpa
|
||||
"plasma" = new/datum/tlv(-1.0, -1.0, 0.2, 0.5), // Partial pressure, kpa
|
||||
"other" = new/datum/tlv(-1.0, -1.0, 0.5, 1.0), // Partial pressure, kpa
|
||||
"pressure" = new/datum/tlv(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.50,ONE_ATMOSPHERE*1.60), /* kpa */
|
||||
"temperature" = new/datum/tlv(200, 210, 273.15, 283.15), // K
|
||||
)
|
||||
|
||||
//all air alarms in area are connected via magic
|
||||
@@ -136,11 +182,222 @@
|
||||
if (.)
|
||||
return
|
||||
user.machine = src
|
||||
user << browse(return_text(user),"window=air_alarm")
|
||||
onclose(user, "air_alarm")
|
||||
refresh_all()
|
||||
|
||||
if ( (get_dist(src, user) > 1 ))
|
||||
if (!istype(user, /mob/living/silicon))
|
||||
user.machine = null
|
||||
user << browse(null, "window=air_alarm")
|
||||
user << browse(null, "window=AAlarmwires")
|
||||
return
|
||||
|
||||
|
||||
else if (istype(user, /mob/living/silicon) && src.aidisabled)
|
||||
user << "AI control for this Air Alarm interface has been disabled."
|
||||
user << browse(null, "window=air_alarm")
|
||||
return
|
||||
|
||||
if(wiresexposed && (!istype(user, /mob/living/silicon)))
|
||||
var/t1 = text("<html><head><title>[alarm_area.name] Air Alarm Wires</title></head><body><B>Access Panel</B><br>\n")
|
||||
var/list/AAlarmwires = list(
|
||||
"Orange" = 1,
|
||||
"Dark red" = 2,
|
||||
"White" = 3,
|
||||
"Yellow" = 4,
|
||||
"Black" = 5,
|
||||
)
|
||||
for(var/wiredesc in AAlarmwires)
|
||||
var/is_uncut = src.AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[wiredesc]]
|
||||
t1 += "[wiredesc] wire: "
|
||||
if(!is_uncut)
|
||||
t1 += "<a href='?src=\ref[src];AAlarmwires=[AAlarmwires[wiredesc]]'>Mend</a>"
|
||||
|
||||
else
|
||||
t1 += "<a href='?src=\ref[src];AAlarmwires=[AAlarmwires[wiredesc]]'>Cut</a> "
|
||||
t1 += "<a href='?src=\ref[src];pulse=[AAlarmwires[wiredesc]]'>Pulse</a> "
|
||||
|
||||
t1 += "<br>"
|
||||
t1 += text("<br>\n[(src.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]<br>\n[((src.shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]<br>\n[(src.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
|
||||
t1 += text("<p><a href='?src=\ref[src];close2=1'>Close</a></p></body></html>")
|
||||
user << browse(t1, "window=AAlarmwires")
|
||||
onclose(user, "AAlarmwires")
|
||||
|
||||
if(!shorted)
|
||||
user << browse(return_text(),"window=air_alarm")
|
||||
onclose(user, "air_alarm")
|
||||
refresh_all()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/alarm/proc/isWireColorCut(var/wireColor)
|
||||
var/wireFlag = AAlarmWireColorToFlag[wireColor]
|
||||
return ((src.AAlarmwires & wireFlag) == 0)
|
||||
|
||||
/obj/machinery/alarm/proc/isWireCut(var/wireIndex)
|
||||
var/wireFlag = AAlarmIndexToFlag[wireIndex]
|
||||
return ((src.AAlarmwires & wireFlag) == 0)
|
||||
|
||||
/obj/machinery/alarm/proc/cut(var/wireColor)
|
||||
var/wireFlag = AAlarmWireColorToFlag[wireColor]
|
||||
var/wireIndex = AAlarmWireColorToIndex[wireColor]
|
||||
AAlarmwires &= ~wireFlag
|
||||
switch(wireIndex)
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
src.locked = 1
|
||||
//world << "Idscan wire cut"
|
||||
|
||||
if(AALARM_WIRE_POWER)
|
||||
src.shock(usr, 50)
|
||||
src.shorted = 1
|
||||
update_icon()
|
||||
//world << "Power wire cut"
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
if (src.aidisabled == 0)
|
||||
src.aidisabled = 1
|
||||
//world << "AI Control Wire Cut"
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
mode = AALARM_MODE_PANIC
|
||||
apply_mode()
|
||||
//world << "Syphon Wire Cut"
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
|
||||
if (alarm_area.atmosalert(2))
|
||||
post_alert(2)
|
||||
spawn(1)
|
||||
src.updateUsrDialog()
|
||||
update_icon()
|
||||
|
||||
//world << "AAlarm Wire Cut"
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/proc/mend(var/wireColor)
|
||||
var/wireFlag = AAlarmWireColorToFlag[wireColor]
|
||||
var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function
|
||||
AAlarmwires |= wireFlag
|
||||
switch(wireIndex)
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
//world << "Idscan wire mended"
|
||||
|
||||
if(AALARM_WIRE_POWER)
|
||||
src.shorted = 0
|
||||
src.shock(usr, 50)
|
||||
update_icon()
|
||||
//world << "Power wire mended"
|
||||
|
||||
if(AALARM_WIRE_AI_CONTROL)
|
||||
if (src.aidisabled == 1)
|
||||
src.aidisabled = 0
|
||||
//world << "AI Cont. wire mended"
|
||||
|
||||
|
||||
// if(AALARM_WIRE_SYPHON)
|
||||
// world << "Syphon Wire mended"
|
||||
|
||||
|
||||
// if(AALARM_WIRE_AALARM)
|
||||
//world << "AAlarm Wire mended"
|
||||
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/proc/pulse(var/wireColor)
|
||||
//var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function
|
||||
var/wireIndex = AAlarmWireColorToIndex[wireColor]
|
||||
switch(wireIndex)
|
||||
if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears
|
||||
src.locked = 0
|
||||
spawn(300)
|
||||
src.locked = 1
|
||||
//world << "Idscan wire pulsed"
|
||||
|
||||
if (AALARM_WIRE_POWER)
|
||||
// world << "Power wire pulsed"
|
||||
if(shorted == 0)
|
||||
shorted = 1
|
||||
update_icon()
|
||||
|
||||
spawn(1200)
|
||||
if(shorted == 1)
|
||||
shorted = 0
|
||||
update_icon()
|
||||
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
// world << "AI Control wire pulsed"
|
||||
if (src.aidisabled == 0)
|
||||
src.aidisabled = 1
|
||||
src.updateDialog()
|
||||
spawn(10)
|
||||
if (src.aidisabled == 1)
|
||||
src.aidisabled = 0
|
||||
src.updateDialog()
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
// world << "Syphon wire pulsed"
|
||||
mode = AALARM_MODE_REPLACEMENT
|
||||
apply_mode()
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
// world << "Aalarm wire pulsed"
|
||||
if (alarm_area.atmosalert(0))
|
||||
post_alert(0)
|
||||
spawn(1)
|
||||
src.updateUsrDialog()
|
||||
update_icon()
|
||||
|
||||
src.updateDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/proc/shock(mob/user, prb)
|
||||
if((stat & (NOPOWER))) // unpowered, no shock
|
||||
return 0
|
||||
if(!prob(prb))
|
||||
return 0 //you lucked out, no shock for you
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start() //sparks always.
|
||||
if (electrocute_mob(user, get_area(src), src))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/machinery/alarm/Topic(href, href_list)
|
||||
src.add_fingerprint(usr)
|
||||
usr.machine = src
|
||||
|
||||
if ( (get_dist(src, usr) > 1 ))
|
||||
if (!istype(usr, /mob/living/silicon))
|
||||
usr.machine = null
|
||||
usr << browse(null, "window=air_alarm")
|
||||
usr << browse(null, "window=AAlarmwires")
|
||||
return
|
||||
|
||||
if (href_list["AAlarmwires"])
|
||||
var/t1 = text2num(href_list["AAlarmwires"])
|
||||
if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
|
||||
usr << "You need wirecutters!"
|
||||
return
|
||||
if (src.isWireColorCut(t1))
|
||||
src.mend(t1)
|
||||
else
|
||||
src.cut(t1)
|
||||
else if (href_list["pulse"])
|
||||
var/t1 = text2num(href_list["pulse"])
|
||||
if (!istype(usr.equipped(), /obj/item/device/multitool))
|
||||
usr << "You need a multitool!"
|
||||
return
|
||||
if (src.isWireColorCut(t1))
|
||||
usr << "You can't pulse a cut wire."
|
||||
return
|
||||
else
|
||||
src.pulse(t1)
|
||||
|
||||
/obj/machinery/alarm/receive_signal(datum/signal/signal)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
@@ -215,11 +472,11 @@
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/alarm/proc/return_text(mob/user)
|
||||
if(!(istype(user, /mob/living/silicon)) && locked)
|
||||
return "<html><head><title>[src]</title></head><body>[return_status()]<hr>[rcon_text()]<hr><i>(Swipe ID card to unlock interface)</i></body></html>"
|
||||
/obj/machinery/alarm/proc/return_text()
|
||||
if(!(istype(usr, /mob/living/silicon)) && locked)
|
||||
return "<html><head><title>[src]</title></head><body>[return_status()]<hr><i>(Swipe ID card to unlock interface)</i></body></html>"
|
||||
else
|
||||
return "<html><head><title>[src]</title></head><body>[return_status()]<hr>[rcon_text()]<hr>[return_controls()]</body></html>"
|
||||
return "<html><head><title>[src]</title></head><body>[return_status()]<hr>[return_controls()]</body></html>"
|
||||
|
||||
/obj/machinery/alarm/proc/return_status()
|
||||
var/turf/location = src.loc
|
||||
@@ -518,6 +775,12 @@ table tr:first-child th:first-child { border: none;}
|
||||
if(href_list["rcon"])
|
||||
rcon_setting = text2num(href_list["rcon"])
|
||||
src.updateUsrDialog()
|
||||
|
||||
if ( (get_dist(src, usr) > 1 ))
|
||||
if (!istype(usr, /mob/living/silicon))
|
||||
usr.machine = null
|
||||
usr << browse(null, "window=air_alarm")
|
||||
|
||||
if(href_list["command"])
|
||||
var/device_id = href_list["id_tag"]
|
||||
switch(href_list["command"])
|
||||
@@ -636,7 +899,10 @@ table tr:first-child th:first-child { border: none;}
|
||||
))
|
||||
|
||||
/obj/machinery/alarm/update_icon()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(wiresexposed)
|
||||
icon_state = "alarmx"
|
||||
return
|
||||
if((stat & (NOPOWER|BROKEN)) || shorted)
|
||||
icon_state = "alarmp"
|
||||
return
|
||||
switch(max(danger_level, alarm_area.atmosalm))
|
||||
@@ -648,7 +914,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
src.icon_state = "alarm1"
|
||||
|
||||
/obj/machinery/alarm/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if((stat & (NOPOWER|BROKEN)) || shorted)
|
||||
return
|
||||
|
||||
var/turf/simulated/location = src.loc
|
||||
@@ -742,26 +1008,37 @@ table tr:first-child th:first-child { border: none;}
|
||||
var/new_area_danger_level = 0
|
||||
for (var/area/A in alarm_area.related)
|
||||
for (var/obj/machinery/alarm/AA in A)
|
||||
if (!(AA.stat & (NOPOWER|BROKEN)))
|
||||
if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
|
||||
new_area_danger_level = max(new_area_danger_level,AA.danger_level)
|
||||
if (alarm_area.atmosalert(new_area_danger_level)) //if area was in normal state or if area was in alert state
|
||||
post_alert(new_area_danger_level)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/wirecutters))
|
||||
/* if (istype(W, /obj/item/weapon/wirecutters))
|
||||
stat ^= BROKEN
|
||||
src.add_fingerprint(user)
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has []activated []!", user, (stat&BROKEN) ? "de" : "re", src), 1)
|
||||
update_icon()
|
||||
return
|
||||
*/
|
||||
if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
|
||||
//user << "You pop the Air Alarm's maintence panel open."
|
||||
wiresexposed = !wiresexposed
|
||||
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
else if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "It does nothing"
|
||||
else
|
||||
if(src.allowed(usr))
|
||||
if(src.allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN))
|
||||
locked = !locked
|
||||
user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface."
|
||||
src.updateUsrDialog()
|
||||
@@ -861,7 +1138,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
d2 = text("<A href='?src=\ref[];time=1'>Initiate Time Lock</A>", src)
|
||||
var/second = src.time % 60
|
||||
var/minute = (src.time - second) / 60
|
||||
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>Fire alarm</B> []\n<HR>\nTimer System: []<BR>\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
|
||||
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>Fire alarm</B> [d1]\n<HR>The current alert level is: [get_security_level()]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? "[minute]:" : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
||||
user << browse(dat, "window=firealarm")
|
||||
onclose(user, "firealarm")
|
||||
else
|
||||
@@ -876,7 +1153,7 @@ table tr:first-child th:first-child { border: none;}
|
||||
d2 = text("<A href='?src=\ref[];time=1'>[]</A>", src, stars("Initiate Time Lock"))
|
||||
var/second = src.time % 60
|
||||
var/minute = (src.time - second) / 60
|
||||
var/dat = text("<HTML><HEAD></HEAD><BODY><TT><B>[]</B> []\n<HR>\nTimer System: []<BR>\nTime Left: [][] <A href='?src=\ref[];tp=-30'>-</A> <A href='?src=\ref[];tp=-1'>-</A> <A href='?src=\ref[];tp=1'>+</A> <A href='?src=\ref[];tp=30'>+</A>\n</TT></BODY></HTML>", stars("Fire alarm"), d1, d2, (minute ? text("[]:", minute) : null), second, src, src, src, src)
|
||||
var/dat = "<HTML><HEAD></HEAD><BODY><TT><B>[stars("Fire alarm")]</B> [d1]\n<HR><b>The current alert level is: [stars(get_security_level())]</b><br><br>\nTimer System: [d2]<BR>\nTime Left: [(minute ? text("[]:", minute) : null)][second] <A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT></BODY></HTML>"
|
||||
user << browse(dat, "window=firealarm")
|
||||
onclose(user, "firealarm")
|
||||
return
|
||||
|
||||
@@ -213,9 +213,10 @@ var/const
|
||||
|
||||
proc/RemoveActiveIndicators() //removes the "active" facehugger indicator from all aliens in the world for this hugger
|
||||
for(var/mob/living/carbon/alien/alien in world)
|
||||
for(var/image/image in alien.client.images)
|
||||
if(image.icon_state == "facehugger_active" && image.loc == src)
|
||||
del(image)
|
||||
if(alien.client)
|
||||
for(var/image/image in alien.client.images)
|
||||
if(image.icon_state == "facehugger_active" && image.loc == src)
|
||||
del(image)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -104,6 +104,7 @@
|
||||
/obj/item/device/pda/captain
|
||||
default_cartridge = /obj/item/weapon/cartridge/captain
|
||||
icon_state = "pda-c"
|
||||
toff = 1
|
||||
|
||||
/obj/item/device/pda/quartermaster
|
||||
default_cartridge = /obj/item/weapon/cartridge/quartermaster
|
||||
@@ -143,6 +144,26 @@
|
||||
if (default_cartridge)
|
||||
cartridge = new default_cartridge(src)
|
||||
|
||||
/obj/item/device/pda/proc/can_use()
|
||||
if(!ismob(loc))
|
||||
return 0
|
||||
var/mob/M = loc
|
||||
|
||||
if(!M.canmove)
|
||||
return 0
|
||||
|
||||
if((src in M.contents) || ( istype(loc, /turf) && in_range(src, M) ) )
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
|
||||
/obj/item/device/pda/MouseDrop(obj/over_object as obj, src_location, over_location)
|
||||
var/mob/M = usr
|
||||
if((!istype(over_object, /obj/screen)) && !M.restrained() && !M.stat && can_use())
|
||||
return attack_self(M)
|
||||
return
|
||||
|
||||
//NOTE: graphic resources are loaded on client login
|
||||
/obj/item/device/pda/attack_self(mob/user as mob)
|
||||
user.machine = src
|
||||
@@ -168,6 +189,8 @@
|
||||
dat += "<h2>PERSONAL DATA ASSISTANT v.1.2</h2>"
|
||||
dat += "Owner: [owner], [ownjob]<br>"
|
||||
dat += text("ID: <A href='?src=\ref[];choice=Authenticate'>[]</A><br>", src, (id ? "[id.registered_name], [id.assignment]" : "----------"))
|
||||
dat += text("<A href='?src=\ref[];choice=UpdateInfo'>[]</A><br>", src, (id ? "Update PDA Info" : ""))
|
||||
|
||||
dat += "Station Time: [round(world.time / 36000)+12]:[(world.time / 600 % 60) < 10 ? add_zero(world.time / 600 % 60, 1) : world.time / 600 % 60]"//:[world.time / 100 % 6][world.time / 100 % 10]"
|
||||
|
||||
dat += "<br><br>"
|
||||
@@ -323,6 +346,7 @@
|
||||
|
||||
dat += data_core.get_manifest(1)
|
||||
dat += "<br>"
|
||||
|
||||
else//Else it links to the cart menu proc. Although, it really uses menu hub 4--menu 4 doesn't really exist as it simply redirects to hub.
|
||||
dat += cart
|
||||
|
||||
@@ -333,9 +357,10 @@
|
||||
/obj/item/device/pda/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/U = usr
|
||||
U.last_target_click = world.time
|
||||
//Looking for master was kind of pointless since PDAs don't appear to have one.
|
||||
if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
|
||||
//if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
|
||||
|
||||
if(can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
|
||||
if ( !(U.stat || U.restrained()) )
|
||||
|
||||
add_fingerprint(U)
|
||||
@@ -362,6 +387,9 @@
|
||||
cartridge.unlock()
|
||||
if ("Authenticate")//Checks for ID
|
||||
id_check(U, 1)
|
||||
if("UpdateInfo")
|
||||
ownjob = id.assignment
|
||||
name = "PDA-[owner] ([ownjob])"
|
||||
if("Eject")//Ejects the cart, only done from hub.
|
||||
if (!isnull(cartridge))
|
||||
var/turf/T = loc
|
||||
@@ -470,6 +498,7 @@
|
||||
return
|
||||
|
||||
var/obj/item/device/pda/P = locate(href_list["target"])
|
||||
if(!istype(P)) return
|
||||
|
||||
if(istype(P, /obj/item/device/pda))
|
||||
if (isnull(P)||P.toff || toff)
|
||||
@@ -480,8 +509,15 @@
|
||||
|
||||
last_text = world.time
|
||||
|
||||
|
||||
// var/AnsweringMS = 0
|
||||
for (var/obj/machinery/message_server/MS in world)
|
||||
MS.send_pda_message("[P.owner]","[owner]","[t]")
|
||||
// if(MS.active)
|
||||
// AnsweringMS++
|
||||
|
||||
// if(!AnsweringMS)
|
||||
// return
|
||||
|
||||
tnote += "<i><b>→ To [P.owner]:</b></i><br>[t]<br>"
|
||||
P.tnote += "<i><b>← From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a>:</b></i><br>[t]<br>"
|
||||
@@ -508,13 +544,20 @@
|
||||
// pAI Message
|
||||
else
|
||||
|
||||
/* var/AnsweringMS = 0
|
||||
for (var/obj/machinery/message_server/MS in world)
|
||||
MS.send_pda_message("[P]","[src]","[t]")
|
||||
if(MS.active)
|
||||
AnsweringMS++
|
||||
|
||||
if(!AnsweringMS)
|
||||
return
|
||||
*/
|
||||
|
||||
tnote += "<i><b>→ To [P]:</b></i><br>[t]<br>"
|
||||
P.tnote += "<i><b>← From <a href='byond://?src=\ref[P];soft=pdamessage;target=\ref[src]'>[src]</a>:</b></i><br>[t]<br>"
|
||||
|
||||
|
||||
for (var/obj/machinery/message_server/MS in world)
|
||||
MS.send_pda_message("[P]","[src]","[t]")
|
||||
|
||||
if (prob(15)) //Give the AI a chance of intercepting the message
|
||||
var/who = src
|
||||
if(prob(50))
|
||||
@@ -524,6 +567,7 @@
|
||||
|
||||
playsound(P.loc, 'twobeep.ogg', 50, 1)
|
||||
|
||||
// log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
|
||||
|
||||
|
||||
if("Send Honk")//Honk virus
|
||||
@@ -697,22 +741,11 @@
|
||||
name = "PDA-[owner] ([ownjob])"
|
||||
user << "\blue Card scanned."
|
||||
else
|
||||
var/input=alert("Would you like to insert the card or update owner information?",,"Insert","Update")
|
||||
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
|
||||
|
||||
if ( ( (src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
|
||||
if ( !(user.stat || user.restrained()) )//If they can still act.
|
||||
if(input=="Insert")
|
||||
id_check(user, 2)
|
||||
else
|
||||
if(!(owner == C:registered_name))
|
||||
user << "\blue Name on card does not match registered name. Please try again."
|
||||
else if((owner == C:registered_name) && (ownjob == C:assignment))
|
||||
user << "\blue Rank is up to date."
|
||||
else if((owner == C:registered_name) && (ownjob != C:assignment))
|
||||
ownjob = C:assignment
|
||||
name = "PDA-[owner] ([ownjob])"
|
||||
user << "\blue Rank updated."
|
||||
id_check(user, 2)
|
||||
user << "\blue You put the ID into the [src.name]'s slot."
|
||||
updateSelfDialog()//Update self dialog on success.
|
||||
return//Return in case of failed check or when successful.
|
||||
updateSelfDialog()//For the non-input related code.
|
||||
@@ -733,10 +766,21 @@
|
||||
O.show_message("\red [user] has analyzed [C]'s vitals!", 1)
|
||||
|
||||
user.show_message("\blue Analyzing Results for [C]:")
|
||||
user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1)
|
||||
user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1)
|
||||
user.show_message("\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]", 1)
|
||||
user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1)
|
||||
user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1)
|
||||
/*
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = C
|
||||
var/list/damaged = H.get_damaged_organs(1,1)
|
||||
user.show_message("\blue Localized Damage, Brute/Burn:",1)
|
||||
if(length(damaged)>0)
|
||||
for(var/datum/organ/external/org in damaged)
|
||||
user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1)
|
||||
else
|
||||
user.show_message("\blue \t Limbs are OK.",1)
|
||||
*/
|
||||
for(var/datum/disease/D in C.viruses)
|
||||
if(!D.hidden[SCANNER])
|
||||
user.show_message(text("\red <b>Warning: [D.form] Detected</b>\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]"))
|
||||
@@ -916,6 +960,7 @@
|
||||
icon = 'pda.dmi'
|
||||
icon_state = "pdabox"
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/PDAbox/New()
|
||||
..()
|
||||
|
||||
107
code/game/objects/electricchair.dm
Normal file
107
code/game/objects/electricchair.dm
Normal file
@@ -0,0 +1,107 @@
|
||||
/obj/structure/stool/bed/chair/e_chair
|
||||
name = "electrified chair"
|
||||
desc = "Looks absolutely terrifying!"
|
||||
icon_state = "e_chair0"
|
||||
var/atom/movable/overlay/overl = null
|
||||
var/on = 0.0
|
||||
var/obj/item/assembly/shock_kit/part1 = null
|
||||
var/isshocking
|
||||
var/datum/effect/effect/system/spark_spread/spark = new /datum/effect/effect/system/spark_spread
|
||||
var/list/mob/living/affected = list()
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/New()
|
||||
|
||||
src.overl = new /atom/movable/overlay( src.loc )
|
||||
src.overl.icon = 'objects.dmi'
|
||||
src.overl.icon_state = "e_chairo0"
|
||||
src.overl.layer = 5
|
||||
src.overl.name = "electrified chair"
|
||||
src.overl.master = src
|
||||
spark.set_up(12, 1, src)
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/Del()
|
||||
|
||||
//src.overl = null
|
||||
del(src.overl)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
var/obj/structure/stool/bed/chair/C = new /obj/structure/stool/bed/chair( src.loc )
|
||||
playsound(src.loc, 'Ratchet.ogg', 50, 1)
|
||||
C.dir = src.dir
|
||||
src.part1.loc = src.loc
|
||||
src.part1.master = null
|
||||
src.part1 = null
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(istype(W, /obj/item/device/assembly/signaler))
|
||||
var/obj/item/assembly/shock_kit/kit = src.part1
|
||||
var/obj/item/device/radio/electropack/target = kit.part2
|
||||
var/obj/item/device/assembly/signaler/S = W
|
||||
target.set_frequency(S.frequency)
|
||||
target.code = S.code
|
||||
for(var/mob/M in viewers(src, null))
|
||||
M.show_message("\red [user] has set the electric chair using the [W].")
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/verb/toggle_power()
|
||||
set name = "Toggle Electric Chair"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if ((usr.stat || usr.restrained() || !( usr.canmove ) || usr.lying))
|
||||
return
|
||||
if(isshocking && on)
|
||||
shock()
|
||||
src.on = !( src.on )
|
||||
src.icon_state = text("e_chair[]", src.on)
|
||||
src.overl.icon_state = text("e_chairo[]", src.on)
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/rotate()
|
||||
..()
|
||||
overlays = null
|
||||
overlays += image('objects.dmi', src, "echair_over", MOB_LAYER + 1, dir) //there's probably a better way of handling this, but eh. -Pete
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/proc/shock()
|
||||
if (!( src.on ))
|
||||
return
|
||||
if(isshocking)
|
||||
processing_objects.Remove(src)
|
||||
src.icon_state = text("e_chair[]", src.on)
|
||||
src.overl.icon_state = text("e_chairo[]", src.on)
|
||||
for(var/mob/living/M in affected)
|
||||
M.jitteriness = 0
|
||||
M.is_jittery = 0
|
||||
M.anchored = 0
|
||||
affected.Remove(M)
|
||||
isshocking = 0
|
||||
return
|
||||
else
|
||||
src.icon_state = "e_chairs"
|
||||
src.overl.icon_state = "e_chairos"
|
||||
spark.start()
|
||||
for(var/mob/M in hearers(src, null))
|
||||
M.show_message("\red The electric chair went off!.", 3, "\red You hear a deep sharp shock.", 2)
|
||||
processing_objects.Add(src)
|
||||
isshocking = 1
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/chair/e_chair/process()
|
||||
// special power handling
|
||||
var/area/A = get_area(src)
|
||||
if(isarea(A) && A.powered(EQUIP))
|
||||
A.use_power(EQUIP, 5000)
|
||||
for(var/mob/living/M in src.loc)
|
||||
affected.Add(M)
|
||||
M.make_jittery(1000)
|
||||
M.anchored = 1
|
||||
M.Stun(600)
|
||||
M.burn_skin(10)
|
||||
spark.start()
|
||||
@@ -49,8 +49,8 @@
|
||||
/obj/item/assembly/shock_kit/receive_signal()
|
||||
//*****
|
||||
//world << "Shock kit got r_signal"
|
||||
if (istype(src.loc, /obj/structure/stool/chair/e_chair))
|
||||
var/obj/structure/stool/chair/e_chair/C = src.loc
|
||||
if (istype(src.loc, /obj/structure/stool/bed/chair/e_chair))
|
||||
var/obj/structure/stool/bed/chair/e_chair/C = src.loc
|
||||
//world << "Shock kit sending shock to EC"
|
||||
C.shock()
|
||||
return
|
||||
|
||||
@@ -4,38 +4,13 @@ DATA CARD
|
||||
ID CARD
|
||||
FINGERPRINT CARD HOLDER
|
||||
FINGERPRINT CARD
|
||||
|
||||
*/
|
||||
|
||||
/obj/item/weapon/card
|
||||
name = "card"
|
||||
desc = "Does card things."
|
||||
icon = 'card.dmi'
|
||||
w_class = 1.0
|
||||
|
||||
var/list/files = list( )
|
||||
|
||||
/obj/item/weapon/card/emag
|
||||
desc = "An identification card. Seems to have some funny chip on it, though."
|
||||
name = "modified identification card"
|
||||
icon_state = "emag"
|
||||
item_state = "card-id"
|
||||
origin_tech = "magnets=2;syndicate=2"
|
||||
var/uses = 5
|
||||
|
||||
New()
|
||||
..()
|
||||
uses = rand(3,5)
|
||||
return
|
||||
|
||||
// DATA CARDS
|
||||
/obj/item/weapon/card/data
|
||||
name = "data disk"
|
||||
desc = "A disk with data."
|
||||
icon_state = "data"
|
||||
var/function = "storage"
|
||||
var/data = "null"
|
||||
var/special = null
|
||||
item_state = "card-id"
|
||||
|
||||
/obj/item/weapon/card/data/verb/label(t as text)
|
||||
set name = "Label Disk"
|
||||
@@ -50,58 +25,9 @@ FINGERPRINT CARD
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
// ID CARDS
|
||||
/obj/item/weapon/card/id
|
||||
name = "identification card"
|
||||
desc = "An identification card."
|
||||
icon_state = "id"
|
||||
item_state = "card-id"
|
||||
var/access = list()
|
||||
var/registered_name = null // The name registered on the card
|
||||
var/assignment = null
|
||||
var/obj/item/weapon/photo/PHOTO = null
|
||||
var/over_jumpsuit = 1 // If set to 0, it won't display on top of the mob's jumpsuit
|
||||
var/dorm = 0 // determines if this ID has claimed a dorm already
|
||||
|
||||
/obj/item/weapon/card/id/gold
|
||||
name = "identification card"
|
||||
desc = "A golden identification card."
|
||||
icon_state = "gold"
|
||||
item_state = "gold_id"
|
||||
|
||||
/obj/item/weapon/card/id/captains_spare
|
||||
name = "Captain's spare ID"
|
||||
icon_state = "gold"
|
||||
item_state = "gold_id"
|
||||
registered_name = "Captain"
|
||||
assignment = "Captain"
|
||||
New()
|
||||
access = get_access("Captain")
|
||||
..()
|
||||
|
||||
/obj/item/weapon/card/id/centcom
|
||||
name = "CentCom ID"
|
||||
desc = "An ID straight from Cent. Com."
|
||||
icon_state = "centcom"
|
||||
registered_name = "Central Command"
|
||||
assignment = "General"
|
||||
New()
|
||||
access = get_all_centcom_access()
|
||||
..()
|
||||
|
||||
/obj/item/weapon/card/id/syndicate
|
||||
name = "agent card"
|
||||
desc = "Shhhhh."
|
||||
access = list(access_maint_tunnels)
|
||||
origin_tech = "syndicate=3"
|
||||
|
||||
/obj/item/weapon/card/id/syndicate_command
|
||||
name = "Syndicate ID card"
|
||||
desc = "An ID straight from the Syndicate."
|
||||
registered_name = "Syndicate"
|
||||
assignment = "Syndicate Overlord"
|
||||
access = list(access_syndicate)
|
||||
|
||||
|
||||
/obj/item/weapon/card/id/attack_self(mob/user as mob)
|
||||
for(var/mob/O in viewers(user, null))
|
||||
@@ -110,6 +36,14 @@ FINGERPRINT CARD
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/item/weapon/card/id/attack_hand(mob/user as mob)
|
||||
var/obj/item/weapon/storage/wallet/WL
|
||||
if( istype(loc, /obj/item/weapon/storage/wallet) )
|
||||
WL = loc
|
||||
..()
|
||||
if(WL)
|
||||
WL.update_icon()
|
||||
|
||||
/obj/item/weapon/card/id/verb/read()
|
||||
set name = "Read ID Card"
|
||||
set category = "Object"
|
||||
@@ -119,37 +53,13 @@ FINGERPRINT CARD
|
||||
return
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
|
||||
src.registered_name = input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)
|
||||
src.assignment = input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")
|
||||
src.name = "[src.registered_name]'s ID Card ([src.assignment])"
|
||||
user << "\blue You successfully forge the ID card."
|
||||
|
||||
/obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(istype(W,/obj/item/weapon/photo))
|
||||
if(!(PHOTO))
|
||||
src.PHOTO = W
|
||||
usr.before_take_item(W)
|
||||
W.loc = src
|
||||
//src.orient2hud(usr)
|
||||
add_fingerprint(usr)
|
||||
usr << "\blue You add the photo to the ID."
|
||||
else
|
||||
usr << "\blue There is already a photo on this ID."
|
||||
|
||||
//PHOTO.loc = locate(0,0,0)
|
||||
|
||||
/obj/item/weapon/card/id/verb/removePhoto()
|
||||
set name = "Remove Photo From ID"
|
||||
set category = "Object"
|
||||
|
||||
if(PHOTO)
|
||||
contents -= PHOTO
|
||||
PHOTO.loc = usr.loc
|
||||
PHOTO.layer = 3
|
||||
PHOTO = null
|
||||
if(!src.registered_name)
|
||||
src.registered_name = input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)
|
||||
src.assignment = input(user, "What occupation would you like to put on this card?\nNote: This will not grant any access levels other than Maintenance.", "Agent card job assignment", "Assistant")
|
||||
src.name = "[src.registered_name]'s ID Card ([src.assignment])"
|
||||
user << "\blue You successfully forge the ID card."
|
||||
else
|
||||
usr << "\blue There is no photo to remove."
|
||||
..()
|
||||
|
||||
|
||||
// FINGERPRINT HOLDER
|
||||
@@ -271,7 +181,9 @@ FINGERPRINT CARD
|
||||
return
|
||||
|
||||
/obj/item/weapon/f_card/proc/display()
|
||||
|
||||
if(!fingerprints) return
|
||||
if (!istype(src.fingerprints, /list))
|
||||
src.fingerprints = params2list(src.fingerprints)
|
||||
if (length(src.fingerprints))
|
||||
var/dat = "<B>Fingerprints on Card</B><HR>"
|
||||
for(var/i = 1, i < (src.fingerprints.len + 1), i++)
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/item/weapon/dnainjector/proc/inject(mob/M as mob)
|
||||
M.radiation += rand(20,50)
|
||||
|
||||
if (!(M.mutations & HUSK)) // prevents husks from having their DNA changed
|
||||
if (!(M.mutations2 & NOCLONE)) // prevents drained people from having their DNA changed
|
||||
if (dnatype == "ui")
|
||||
if (!block) //isolated block?
|
||||
if (ue) //unique enzymes? yes
|
||||
@@ -66,6 +66,8 @@
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been injected with [name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [name] to inject [M.name] ([M.ckey])</font>")
|
||||
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) used the [name] to inject [M.name] ([M.ckey])</font>")
|
||||
|
||||
if (user)
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
|
||||
|
||||
@@ -211,6 +211,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
if(!istype(M, /mob/living/carbon/human)) return
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.mind in ticker.mode.head_revolutionaries)
|
||||
visible_message("\red [M] seems to resist the implant.", 1)
|
||||
for(var/mob/O in (viewers(M) - M))
|
||||
O.show_message("\red [M] seems to resist the implant.", 1)
|
||||
M << "\red You resist the implant."
|
||||
@@ -220,7 +221,6 @@ the implant may become unstable and either pre-maturely inject the subject or si
|
||||
H << "\blue You feel a surge of loyalty towards NanoTrasen."
|
||||
return
|
||||
|
||||
|
||||
//BS12 Explosive
|
||||
/obj/item/weapon/implant/explosive
|
||||
name = "explosive"
|
||||
|
||||
@@ -61,9 +61,9 @@ FLOOR TILES
|
||||
|
||||
// /datum/stack_recipe/New(title, result_type, req_amount, res_amount, max_res_amount, time, one_per_turf, on_floor = 0)
|
||||
var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
new/datum/stack_recipe("stool", /obj/structure/stool), \
|
||||
new/datum/stack_recipe("chair", /obj/structure/stool/chair, one_per_turf = 1), \
|
||||
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1), \
|
||||
new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
|
||||
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, one_per_turf = 1), \
|
||||
|
||||
@@ -1,49 +1,34 @@
|
||||
/obj/structure/stool/ex_act(severity)
|
||||
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/structure/stool/blob_act()
|
||||
if(prob(75))
|
||||
new /obj/item/stack/sheet/metal( src.loc )
|
||||
new /obj/item/stack/sheet/metal(src.loc)
|
||||
del(src)
|
||||
|
||||
/obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'Ratchet.ogg', 50, 1)
|
||||
new /obj/item/stack/sheet/metal( src.loc )
|
||||
//SN src = null
|
||||
new /obj/item/stack/sheet/metal(src.loc)
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/stool/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/obj/structure/stool/bed/chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'Ratchet.ogg', 50, 1)
|
||||
new /obj/item/stack/sheet/metal( src.loc )
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
..()
|
||||
if (istype(W, /obj/item/assembly/shock_kit))
|
||||
var/obj/structure/stool/chair/e_chair/E = new /obj/structure/stool/chair/e_chair( src.loc )
|
||||
if(istype(W, /obj/item/assembly/shock_kit))
|
||||
var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc)
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
E.dir = src.dir
|
||||
E.part1 = W
|
||||
@@ -51,52 +36,49 @@
|
||||
W.master = E
|
||||
user.u_equip(W)
|
||||
W.layer = initial(W.layer)
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/Del()
|
||||
for(var/mob/M in src.buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
M.lying = 0
|
||||
unbuckle_all()
|
||||
unbuckle()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/stool/proc/unbuckle_all()
|
||||
for(var/mob/M in src:buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
M.buckled = null
|
||||
M.anchored = 0
|
||||
M.update_clothing()
|
||||
/obj/structure/stool/bed/proc/unbuckle()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
|
||||
buckled_mob.buckled = null
|
||||
buckled_mob.anchored = 0
|
||||
buckled_mob.lying = 0
|
||||
buckled_mob = null
|
||||
return
|
||||
|
||||
/obj/structure/stool/proc/manual_unbuckle_all(mob/user as mob)
|
||||
var/N = 0;
|
||||
for(var/mob/M in src:buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
if (M != user)
|
||||
M.visible_message(\
|
||||
"\blue [M.name] was unbuckled by [user.name]!",\
|
||||
/obj/structure/stool/bed/proc/manual_unbuckle(mob/user as mob)
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src)
|
||||
if(buckled_mob != user)
|
||||
buckled_mob.visible_message(\
|
||||
"\blue [buckled_mob.name] was unbuckled by [user.name]!",\
|
||||
"You unbuckled from [src] by [user.name].",\
|
||||
"You hear metal clanking")
|
||||
else
|
||||
M.visible_message(\
|
||||
"\blue [M.name] unbuckled \himself!",\
|
||||
buckled_mob.visible_message(\
|
||||
"\blue [buckled_mob.name] unbuckled himself!",\
|
||||
"You unbuckle yourself from [src].",\
|
||||
"You hear metal clanking")
|
||||
// world << "[M] is no longer buckled to [src]"
|
||||
M.anchored = 0
|
||||
M.buckled = null
|
||||
M.update_clothing()
|
||||
N++
|
||||
return N
|
||||
unbuckle()
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/structure/stool/proc/buckle_mob(mob/M as mob, mob/user as mob)
|
||||
/obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob)
|
||||
if (!ticker)
|
||||
user << "You can't buckle anyone in before the game starts."
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled))
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai)))
|
||||
return
|
||||
|
||||
unbuckle()
|
||||
|
||||
if (M == usr)
|
||||
M.visible_message(\
|
||||
"\blue [M.name] buckles in!",\
|
||||
@@ -104,180 +86,57 @@
|
||||
"You hear metal clanking")
|
||||
else
|
||||
M.visible_message(\
|
||||
"\blue [M.name] is buckled into [src] by [user.name]!",\
|
||||
"You buckled in to [src] by [user.name].",\
|
||||
"\blue [M.name] is buckled in to [src] by [user.name]!",\
|
||||
"You are buckled in to [src] by [user.name].",\
|
||||
"You hear metal clanking")
|
||||
M.anchored = 1
|
||||
M.buckled = src
|
||||
M.loc = src.loc
|
||||
M.dir = src.dir
|
||||
M.update_clothing()
|
||||
src:buckled_mobs += M
|
||||
src.buckled_mob = M
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/MouseDrop_T(mob/M as mob, mob/user as mob)
|
||||
if (!istype(M)) return
|
||||
if(!istype(M)) return
|
||||
buckle_mob(M, user)
|
||||
M.lying = 1
|
||||
return
|
||||
|
||||
/obj/structure/stool/bed/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/structure/stool/bed/attack_hand(mob/user as mob)
|
||||
for(var/mob/M in src.buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
M.lying = 0
|
||||
if (manual_unbuckle_all(user))
|
||||
src.add_fingerprint(user)
|
||||
manual_unbuckle(user)
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/New()
|
||||
|
||||
src.overl = new /atom/movable/overlay( src.loc )
|
||||
src.overl.icon = 'objects.dmi'
|
||||
src.overl.icon_state = "e_chairo0"
|
||||
src.overl.layer = 5
|
||||
src.overl.name = "electrified chair"
|
||||
src.overl.master = src
|
||||
spark.set_up(12, 1, src)
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/Del()
|
||||
|
||||
//src.overl = null
|
||||
del(src.overl)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if (istype(W, /obj/item/weapon/wrench))
|
||||
var/obj/structure/stool/chair/C = new /obj/structure/stool/chair( src.loc )
|
||||
playsound(src.loc, 'Ratchet.ogg', 50, 1)
|
||||
C.dir = src.dir
|
||||
src.part1.loc = src.loc
|
||||
src.part1.master = null
|
||||
src.part1 = null
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(istype(W, /obj/item/device/assembly/signaler))
|
||||
var/obj/item/assembly/shock_kit/kit = src.part1
|
||||
var/obj/item/device/radio/electropack/target = kit.part2
|
||||
var/obj/item/device/assembly/signaler/S = W
|
||||
target.set_frequency(S.frequency)
|
||||
target.code = S.code
|
||||
for(var/mob/M in viewers(src, null))
|
||||
M.show_message("\red [user] has set the electric chair using the [W].")
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/verb/toggle_power()
|
||||
set name = "Toggle Electric Chair"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if ((usr.stat || usr.restrained() || !( usr.canmove ) || usr.lying))
|
||||
return
|
||||
if(isshocking && on)
|
||||
shock()
|
||||
src.on = !( src.on )
|
||||
src.icon_state = text("e_chair[]", src.on)
|
||||
src.overl.icon_state = text("e_chairo[]", src.on)
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/proc/shock()
|
||||
if (!( src.on ))
|
||||
return
|
||||
if(isshocking)
|
||||
processing_objects.Remove(src)
|
||||
src.icon_state = text("e_chair[]", src.on)
|
||||
src.overl.icon_state = text("e_chairo[]", src.on)
|
||||
for(var/mob/living/M in affected)
|
||||
M.jitteriness = 0
|
||||
M.is_jittery = 0
|
||||
M.anchored = 0
|
||||
affected.Remove(M)
|
||||
isshocking = 0
|
||||
return
|
||||
else
|
||||
src.icon_state = "e_chairs"
|
||||
src.overl.icon_state = "e_chairos"
|
||||
spark.start()
|
||||
for(var/mob/M in hearers(src, null))
|
||||
M.show_message("\red The electric chair went off!.", 3, "\red You hear a deep sharp shock.", 2)
|
||||
processing_objects.Add(src)
|
||||
isshocking = 1
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/e_chair/process()
|
||||
// special power handling
|
||||
var/area/A = get_area(src)
|
||||
if(isarea(A) && A.powered(EQUIP))
|
||||
A.use_power(EQUIP, 5000)
|
||||
for(var/mob/living/M in src.loc)
|
||||
affected.Add(M)
|
||||
M.make_jittery(1000)
|
||||
M.anchored = 1
|
||||
M.Stun(600)
|
||||
M.burn_skin(10)
|
||||
spark.start()
|
||||
|
||||
/obj/structure/stool/chair/ex_act(severity)
|
||||
unbuckle_all()
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
del(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
del(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/blob_act()
|
||||
if(prob(75))
|
||||
unbuckle_all()
|
||||
del(src)
|
||||
|
||||
/obj/structure/stool/chair/New()
|
||||
/obj/structure/stool/bed/chair/New()
|
||||
src.verbs -= /atom/movable/verb/pull
|
||||
if (src.dir == NORTH)
|
||||
if(src.dir == NORTH)
|
||||
src.layer = FLY_LAYER
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/Del()
|
||||
unbuckle_all()
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/verb/rotate()
|
||||
/obj/structure/stool/bed/chair/verb/rotate()
|
||||
set name = "Rotate Chair"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
src.dir = turn(src.dir, 90)
|
||||
if (src.dir == NORTH)
|
||||
if(src.dir == NORTH)
|
||||
src.layer = FLY_LAYER
|
||||
else
|
||||
src.layer = OBJ_LAYER
|
||||
|
||||
if(buckled_mob)
|
||||
buckled_mob.dir = dir
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/MouseDrop_T(mob/M as mob, mob/user as mob)
|
||||
/obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob)
|
||||
if(!istype(M)) return
|
||||
buckle_mob(M, user)
|
||||
return
|
||||
|
||||
/obj/structure/stool/chair/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/structure/stool/chair/attack_hand(mob/user as mob)
|
||||
if (manual_unbuckle_all(user))
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
|
||||
//roller bed
|
||||
|
||||
/obj/structure/stool/bed/roller
|
||||
@@ -286,65 +145,28 @@
|
||||
icon_state = "down"
|
||||
anchored = 0
|
||||
|
||||
Move()
|
||||
..()
|
||||
for(var/mob/M in src:buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
M.loc = src.loc
|
||||
/obj/structure/stool/bed/roller/Move()
|
||||
..()
|
||||
if(buckled_mob)
|
||||
if(buckled_mob.buckled == src)
|
||||
buckled_mob.loc = src.loc
|
||||
|
||||
buckle_mob(mob/M as mob, mob/user as mob)
|
||||
if (!ticker)
|
||||
user << "You can't buckle anyone in before the game starts."
|
||||
return 0
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled))
|
||||
return 0
|
||||
if (M == usr)
|
||||
M.visible_message(\
|
||||
"\blue [M.name] buckles in!",\
|
||||
"You buckle yourself to [src].",\
|
||||
"You hear metal clanking")
|
||||
else
|
||||
M.visible_message(\
|
||||
"\blue [M.name] is buckled in to [src] by [user.name]!",\
|
||||
"You buckled into [src] by [user.name].",\
|
||||
"You hear metal clanking")
|
||||
M.anchored = 1
|
||||
M.buckled = src
|
||||
M.loc = src.loc
|
||||
M.pixel_y = 6
|
||||
M.update_clothing()
|
||||
src:buckled_mobs += M
|
||||
src.add_fingerprint(user)
|
||||
density = 1
|
||||
icon_state = "up"
|
||||
return 1
|
||||
/obj/structure/stool/bed/roller/buckle_mob(mob/M as mob, mob/user as mob)
|
||||
if ((!( istype(M, /mob) ) || get_dist(src, user) > 1 || M.loc != src.loc || user.restrained() || usr.stat || M.buckled || istype(usr, /mob/living/silicon/pai)))
|
||||
return
|
||||
M.pixel_y = 6
|
||||
M.update_clothing()
|
||||
density = 1
|
||||
icon_state = "up"
|
||||
..()
|
||||
return
|
||||
|
||||
manual_unbuckle_all(mob/user as mob)
|
||||
var/N = 0;
|
||||
for(var/mob/M in src:buckled_mobs)
|
||||
if (M.buckled == src)
|
||||
if (M != user)
|
||||
M.visible_message(\
|
||||
"\blue [M.name] was unbuckled by [user.name]!",\
|
||||
"You unbuckled from [src] by [user.name].",\
|
||||
"You hear metal clanking")
|
||||
else
|
||||
var/t_himself = "itself"
|
||||
if (M.gender == MALE)
|
||||
t_himself = "himself"
|
||||
else if (M.gender == FEMALE)
|
||||
t_himself = "herself"
|
||||
|
||||
M.visible_message(\
|
||||
"\blue [M.name] unbuckled [t_himself]!",\
|
||||
"You unbuckle yourself from [src].",\
|
||||
"You hear metal clanking")
|
||||
M.pixel_y = 0
|
||||
M.anchored = 0
|
||||
M.buckled = null
|
||||
M.update_clothing()
|
||||
N++
|
||||
if(N)
|
||||
density = 0
|
||||
icon_state = "down"
|
||||
return N
|
||||
/obj/structure/stool/bed/roller/manual_unbuckle(mob/user as mob)
|
||||
if(buckled_mob)
|
||||
buckled_mob.pixel_y = 0
|
||||
buckled_mob.anchored = 0
|
||||
buckled_mob.buckled = null
|
||||
density = 0
|
||||
icon_state = "down"
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/obj/screen/storage/boxes = null
|
||||
var/obj/screen/close/closer = null
|
||||
w_class = 3.0
|
||||
var/foldable = null // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard
|
||||
|
||||
/obj/item/weapon/storage/proc/return_inv()
|
||||
|
||||
@@ -96,7 +97,7 @@
|
||||
return
|
||||
|
||||
//This proc is called when you want to place an item into the storage item.
|
||||
/obj/item/weapon/storage/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
/obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob)
|
||||
..()
|
||||
if(isrobot(user))
|
||||
user << "\blue You're a robot. No."
|
||||
@@ -138,6 +139,7 @@
|
||||
user << "\red The tray won't fit in [src]."
|
||||
return
|
||||
else
|
||||
|
||||
W.loc = user.loc
|
||||
if ((user.client && user.s_active != src))
|
||||
user.client.screen -= W
|
||||
@@ -157,19 +159,13 @@
|
||||
user << "\red The [src] cannot hold [W] as it's a storage item of the same size."
|
||||
return //To prevent the stacking of the same sized items.
|
||||
|
||||
if(user)
|
||||
user.u_equip(W)
|
||||
W.loc = src
|
||||
if ((user.client && user.s_active != src))
|
||||
user.client.screen -= W
|
||||
src.orient2hud(user)
|
||||
W.dropped(user)
|
||||
add_fingerprint(user)
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\blue [user] has added [W] to [src]!"))
|
||||
else
|
||||
W.loc = src
|
||||
orient_objs(5, 10, 4 + min(7, storage_slots), 10)
|
||||
user.u_equip(W)
|
||||
W.loc = src
|
||||
if ((user.client && user.s_active != src))
|
||||
user.client.screen -= W
|
||||
src.orient2hud(user)
|
||||
W.dropped(user)
|
||||
add_fingerprint(user)
|
||||
|
||||
if(istype(src, /obj/item/weapon/storage/backpack/santabag)) // update the santa bag icon
|
||||
if(contents.len < 5)
|
||||
@@ -180,6 +176,8 @@
|
||||
src.icon_state = "giftbag2"
|
||||
|
||||
if (istype(W, /obj/item/weapon/gun/energy/crossbow)) return //STEALTHY
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\blue [user] has added [W] to [src]!"))
|
||||
//Foreach goto(139)
|
||||
return
|
||||
|
||||
@@ -249,8 +247,29 @@
|
||||
/obj/screen/storage/attackby(W, mob/user as mob)
|
||||
src.master.attackby(W, user)
|
||||
return
|
||||
// BubbleWrap - A box can be folded up to make card
|
||||
/obj/item/weapon/storage/attack_self(mob/user as mob)
|
||||
if ( contents.len )
|
||||
return
|
||||
if ( !ispath(src.foldable) )
|
||||
return
|
||||
var/found = 0
|
||||
// Close any open UI windows first
|
||||
for(var/mob/M in range(1))
|
||||
if (M.s_active == src)
|
||||
src.close(M)
|
||||
if ( M == user )
|
||||
found = 1
|
||||
if ( !found ) // User is too far away
|
||||
return
|
||||
// Now make the cardboard
|
||||
user << "\blue You fold [src] flat."
|
||||
new src.foldable(get_turf(src))
|
||||
del(src)
|
||||
//BubbleWrap END
|
||||
|
||||
/obj/item/weapon/storage/box/
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
/obj/item/weapon/storage/box/survival/New()
|
||||
..()
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
if ("clownstep") soundin = pick('clownstep1.ogg','clownstep2.ogg')
|
||||
if ("swing_hit") soundin = pick('genhit1.ogg', 'genhit2.ogg', 'genhit3.ogg')
|
||||
if ("hiss") soundin = pick('hiss1.ogg','hiss2.ogg','hiss3.ogg','hiss4.ogg')
|
||||
if ("pageturn") soundin = pick('pageturn1.ogg', 'pageturn2.ogg','pageturn3.ogg')
|
||||
|
||||
var/sound/S = sound(soundin)
|
||||
S.wait = 0 //No queue
|
||||
@@ -27,10 +28,16 @@
|
||||
|
||||
M << S
|
||||
|
||||
for(var/obj/structure/closet/L in range(world.view+extrarange, source))
|
||||
if(locate(/mob/, L))
|
||||
for(var/mob/Ml in L)
|
||||
Ml << S
|
||||
for(var/obj/structure/closet/L in range(world.view+extrarange, source))
|
||||
if(locate(/mob/, L))
|
||||
for(var/mob/M in L)
|
||||
if (M.client)
|
||||
if(M.ear_deaf <= 0 || !M.ear_deaf)
|
||||
if(isturf(source))
|
||||
var/dx = source.x - M.x
|
||||
S.pan = max(-100, min(100, dx/8.0 * 100))
|
||||
|
||||
M << S
|
||||
// Now plays for people in lockers! -- Polymorph
|
||||
|
||||
/mob/proc/playsound_local(var/atom/source, soundin, vol as num, vary, extrarange as num)
|
||||
@@ -58,14 +65,14 @@
|
||||
|
||||
src << S
|
||||
|
||||
client/verb/Toggle_Soundscape()
|
||||
set category = "OOC"
|
||||
client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
|
||||
set category = "Special Verbs"
|
||||
set name = "Toggle Ambience"
|
||||
usr:client:no_ambi = !usr:client:no_ambi
|
||||
if(usr:client:no_ambi)
|
||||
usr << sound(pick('shipambience.ogg'), repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
usr << sound(pick('shipambience.ogg','ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg','ambicha1.ogg','ambicha2.ogg','ambicha3.ogg','ambicha4.ogg','ambimalf.ogg','ambispace.ogg','ambimine.ogg','title2.ogg'), repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
else
|
||||
usr << sound(pick('shipambience.ogg'), repeat = 1, wait = 0, volume = 35, channel = 2)
|
||||
usr << sound(pick('shipambience.ogg','ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg','ambicha1.ogg','ambicha2.ogg','ambicha3.ogg','ambicha4.ogg','ambimalf.ogg','ambispace.ogg','ambimine.ogg','title2.ogg'), repeat = 1, wait = 0, volume = 35, channel = 2)
|
||||
usr << "Toggled ambience sound."
|
||||
return
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ var/list/supply_groups = new()
|
||||
if (prob(5))
|
||||
del(src)
|
||||
|
||||
/area/supplyshuttle/
|
||||
/area/supplyshuttle
|
||||
name = "Supply Shuttle"
|
||||
icon_state = "supply"
|
||||
requires_power = 0
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
if(istype(usr,/mob))
|
||||
var/mob/M = usr
|
||||
M.midis = !M.midis
|
||||
|
||||
if(M.client)
|
||||
M.client.midis = !M.client.midis
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
else if(!M.client.stealth && (M.client.holder.level != -3))
|
||||
usr << "\t[pick(nobles)] [M.client]"
|
||||
|
||||
var/list/nobles = list("Baron","Bookkeeper","Captain of the Guard","Chief medical dwarf","Count","Dungeon master","Duke","General","Mayor","Outpost liaison","Sheriff","Champion")
|
||||
var/list/nobles = list("Baron","Bookkeeper","Captain of the Guard","Chief Medical Dwarf","Count","Dungeon Master","Duke","General","Mayor","Outpost Liaison","Sheriff","Champion")
|
||||
|
||||
/client/verb/active_players()
|
||||
set category = "OOC"
|
||||
|
||||
@@ -400,6 +400,7 @@
|
||||
usr << "\blue [grenades] / [max_grenades] Grenades."
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
if((istype(I, /obj/item/weapon/chem_grenade)) || (istype(I, /obj/item/weapon/flashbang)) || (istype(I, /obj/item/weapon/smokebomb)) || (istype(I, /obj/item/weapon/mustardbomb)) || (istype(I, /obj/item/weapon/empgrenade)))
|
||||
if(grenades.len < max_grenades)
|
||||
user.drop_item()
|
||||
@@ -411,7 +412,15 @@
|
||||
usr << "\red The grenade launcher cannot hold more grenades."
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
if(target == user) return
|
||||
|
||||
if (istype(target, /obj/item/weapon/storage/backpack ))
|
||||
return
|
||||
|
||||
else if (locate (/obj/structure/table, src.loc))
|
||||
return
|
||||
|
||||
else if(target == user)
|
||||
return
|
||||
|
||||
if(grenades.len)
|
||||
spawn(0) fire_grenade(target,user)
|
||||
@@ -420,7 +429,60 @@
|
||||
|
||||
proc
|
||||
fire_grenade(atom/target, mob/user)
|
||||
if (locate (/obj/structure/table, src.loc))
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message(text("\red [] fired a grenade!", user), 1)
|
||||
user << "\red You fire the grenade launcher!"
|
||||
if (istype(grenades[1], /obj/item/weapon/chem_grenade))
|
||||
var/obj/item/weapon/chem_grenade/F = grenades[1]
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.throw_at(target, 30, 2)
|
||||
message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
|
||||
log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
|
||||
F.state = 1
|
||||
F.icon_state = initial(icon_state)+"_armed"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
F.explode()
|
||||
else if (istype(grenades[1], /obj/item/weapon/flashbang))
|
||||
var/obj/item/weapon/flashbang/F = grenades[1]
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.throw_at(target, 30, 2)
|
||||
F.active = 1
|
||||
F.icon_state = "flashbang1"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
F.prime()
|
||||
else if (istype(grenades[1], /obj/item/weapon/smokebomb))
|
||||
var/obj/item/weapon/smokebomb/F = grenades[1]
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.throw_at(target, 30, 2)
|
||||
F.icon_state = "flashbang1"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
F.prime()
|
||||
else if (istype(grenades[1], /obj/item/weapon/mustardbomb))
|
||||
var/obj/item/weapon/mustardbomb/F = grenades[1]
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.throw_at(target, 30, 2)
|
||||
F.icon_state = "flashbang1"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
F.prime()
|
||||
else if (istype(grenades[1], /obj/item/weapon/empgrenade))
|
||||
var/obj/item/weapon/empgrenade/F = grenades[1]
|
||||
grenades -= F
|
||||
F.loc = user.loc
|
||||
F.throw_at(target, 30, 2)
|
||||
F.active = 1
|
||||
F.icon_state = "empar"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
F.prime()
|
||||
if (locate (/obj/structure/table, src.loc) || locate (/obj/item/weapon/storage, src.loc))
|
||||
return
|
||||
else
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
@@ -433,7 +495,7 @@
|
||||
F.throw_at(target, 30, 2)
|
||||
message_admins("[key_name_admin(user)] fired a chemistry grenade from a grenade launcher ([src.name]).")
|
||||
log_game("[key_name_admin(user)] used a chemistry grenade ([src.name]).")
|
||||
F.path = 1
|
||||
F.state = 1
|
||||
F.icon_state = initial(icon_state)+"_armed"
|
||||
playsound(user.loc, 'armbomb.ogg', 75, 1, -3)
|
||||
spawn(15)
|
||||
@@ -480,6 +542,7 @@
|
||||
|
||||
/obj/item/weapon/gun/syringe
|
||||
name = "syringe gun"
|
||||
desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance."
|
||||
icon = 'gun.dmi'
|
||||
icon_state = "syringegun"
|
||||
item_state = "syringegun"
|
||||
@@ -495,19 +558,19 @@
|
||||
set src in view()
|
||||
..()
|
||||
if (!(usr in view(2)) && usr!=src.loc) return
|
||||
usr << "\icon [src] Syringe gun:"
|
||||
usr << "\blue [syringes] / [max_syringes] Syringes."
|
||||
usr << "\blue [syringes.len] / [max_syringes] syringes."
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/syringe))
|
||||
if(syringes.len < max_syringes)
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
syringes += I
|
||||
user << "\blue You put the syringe in the syringe gun."
|
||||
user << "\blue [syringes.len] / [max_syringes] Syringes."
|
||||
user << "\blue You put the syringe in [src]."
|
||||
user << "\blue [syringes.len] / [max_syringes] syringes."
|
||||
else
|
||||
usr << "\red The syringe gun cannot hold more syringes."
|
||||
usr << "\red [src] cannot hold more syringes."
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
if(!isturf(target.loc) || target == user) return
|
||||
@@ -515,7 +578,7 @@
|
||||
if(syringes.len)
|
||||
spawn(0) fire_syringe(target,user)
|
||||
else
|
||||
usr << "\red The syringe gun is empty."
|
||||
usr << "\red [src] is empty."
|
||||
|
||||
proc
|
||||
fire_syringe(atom/target, mob/user)
|
||||
@@ -558,84 +621,11 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/item/weapon/gun/rapidsyringe
|
||||
/obj/item/weapon/gun/syringe/rapidsyringe
|
||||
name = "rapid syringe gun"
|
||||
icon = 'gun.dmi'
|
||||
desc = "A modification of the syringe gun design, using a rotating cylinder to store up to four syringes."
|
||||
icon_state = "rapidsyringegun"
|
||||
item_state = "rapidsyringegun"
|
||||
w_class = 3.0
|
||||
throw_speed = 4
|
||||
throw_range = 10
|
||||
force = 8.0
|
||||
var/list/syringes = new/list()
|
||||
var/max_syringes = 40
|
||||
|
||||
examine()
|
||||
set src in view()
|
||||
..()
|
||||
if (!(usr in view(2)) && usr!=src.loc) return
|
||||
usr << "\icon [src] Rapid Syringe gun:"
|
||||
usr << "\blue [syringes] / [max_syringes] Syringes."
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/reagent_containers/syringe))
|
||||
if(syringes.len < max_syringes)
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
syringes += I
|
||||
user << "\blue You put the syringe in the rapid syringe gun."
|
||||
user << "\blue [syringes.len] / [max_syringes] Syringes."
|
||||
else
|
||||
usr << "\red The rapid syringe gun cannot hold more syringes."
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
if(!isturf(target.loc) || target == user) return
|
||||
|
||||
if(syringes.len)
|
||||
spawn(0) fire_syringe(target,user)
|
||||
else
|
||||
usr << "\red rapid The syringe gun is empty."
|
||||
|
||||
proc
|
||||
fire_syringe(atom/target, mob/user)
|
||||
if (locate (/obj/structure/table, src.loc))
|
||||
return
|
||||
else
|
||||
var/turf/trg = get_turf(target)
|
||||
var/obj/effect/syringe_gun_dummy/D = new/obj/effect/syringe_gun_dummy(get_turf(src))
|
||||
var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
|
||||
S.reagents.trans_to(D, S.reagents.total_volume)
|
||||
syringes -= S
|
||||
del(S)
|
||||
D.icon_state = "syringeproj"
|
||||
D.name = "syringe"
|
||||
playsound(user.loc, 'syringeproj.ogg', 50, 1)
|
||||
|
||||
for(var/i=0, i<6, i++)
|
||||
if(!D) break
|
||||
if(D.loc == trg) break
|
||||
step_towards(D,trg)
|
||||
|
||||
for(var/mob/living/carbon/M in D.loc)
|
||||
if(!istype(M,/mob/living/carbon)) continue
|
||||
if(M == user) continue
|
||||
D.reagents.trans_to(M, 15)
|
||||
M.take_organ_damage(5)
|
||||
for(var/mob/O in viewers(world.view, D))
|
||||
O.show_message(text("\red [] was hit by the syringe!", M), 1)
|
||||
|
||||
del(D)
|
||||
if(D)
|
||||
for(var/atom/A in D.loc)
|
||||
if(A == user) continue
|
||||
if(A.density) del(D)
|
||||
|
||||
sleep(1)
|
||||
|
||||
if (D) spawn(10) del(D)
|
||||
|
||||
return
|
||||
|
||||
max_syringes = 4
|
||||
|
||||
/obj/structure/reagent_dispensers
|
||||
name = "Dispenser"
|
||||
@@ -731,9 +721,15 @@
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
attack_self(mob/user as mob)
|
||||
return
|
||||
attack(mob/M as mob, mob/user as mob, def_zone)
|
||||
return
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
return
|
||||
@@ -943,6 +939,7 @@
|
||||
return attack_hand()
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
@@ -968,7 +965,7 @@
|
||||
if(!T.dna)
|
||||
usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)"
|
||||
return
|
||||
if(T.mutations & HUSK) //target done been et, no more blood in him
|
||||
if(T.mutations2 & NOCLONE) //target done been et, no more blood in him
|
||||
user << "\red You are unable to locate any blood."
|
||||
return
|
||||
if(ishuman(T))
|
||||
@@ -1108,6 +1105,35 @@
|
||||
else
|
||||
icon_state = "[(has_blood?"b":"")][rounded_vol]"
|
||||
item_state = "syringe_[rounded_vol]"
|
||||
if(reagents.total_volume)
|
||||
var/obj/effect/overlay = new/obj
|
||||
overlay.icon = 'syringefilling.dmi'
|
||||
switch(rounded_vol)
|
||||
if(5) overlay.icon_state = "5"
|
||||
if(10) overlay.icon_state = "10"
|
||||
if(15) overlay.icon_state = "15"
|
||||
|
||||
var/list/rgbcolor = list(0,0,0)
|
||||
var/finalcolor
|
||||
for(var/datum/reagent/re in reagents.reagent_list) // natural color mixing bullshit/algorithm
|
||||
if(!finalcolor)
|
||||
rgbcolor = GetColors(re.color)
|
||||
finalcolor = re.color
|
||||
else
|
||||
var/newcolor[3]
|
||||
var/prergbcolor[3]
|
||||
prergbcolor = rgbcolor
|
||||
newcolor = GetColors(re.color)
|
||||
|
||||
rgbcolor[1] = (prergbcolor[1]+newcolor[1])/2
|
||||
rgbcolor[2] = (prergbcolor[2]+newcolor[2])/2
|
||||
rgbcolor[3] = (prergbcolor[3]+newcolor[3])/2
|
||||
|
||||
finalcolor = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3])
|
||||
|
||||
overlay.icon += finalcolor
|
||||
if(!istype(src.loc, /turf)) overlay.layer = 30
|
||||
overlays += overlay
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/ld50_syringe
|
||||
@@ -1150,6 +1176,10 @@
|
||||
attack_paw()
|
||||
return attack_hand()
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
if(!target.reagents) return
|
||||
|
||||
@@ -1267,6 +1297,9 @@
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to inject [M.name] ([M.ckey])</font>")
|
||||
log_admin("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].")
|
||||
message_admins("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].")
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
|
||||
src.reagents.reaction(M, INGEST)
|
||||
if(M.reagents)
|
||||
var/trans = reagents.trans_to(M, amount_per_transfer_from_this)
|
||||
@@ -1355,6 +1388,7 @@
|
||||
return
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
attack_self(mob/user as mob)
|
||||
return
|
||||
@@ -1395,6 +1429,8 @@
|
||||
log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
for(var/mob/O in viewers(world.view, user))
|
||||
O.show_message("\red [user] feeds [M] [src].", 1)
|
||||
|
||||
@@ -1487,6 +1523,7 @@
|
||||
return 0
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
return
|
||||
@@ -1509,6 +1546,7 @@
|
||||
var/slices_num
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
if((slices_num <= 0 || !slices_num) || !slice_path)
|
||||
return 1
|
||||
var/inaccurate = 0
|
||||
@@ -1621,6 +1659,8 @@
|
||||
log_admin("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
|
||||
if(reagents.total_volume)
|
||||
reagents.reaction(M, INGEST)
|
||||
@@ -1712,6 +1752,9 @@
|
||||
if(!icon_state)
|
||||
icon_state = "pill[rand(1,20)]"
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
attack_self(mob/user as mob)
|
||||
return
|
||||
attack(mob/M as mob, mob/user as mob, def_zone)
|
||||
@@ -1742,6 +1785,8 @@
|
||||
message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
|
||||
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
if(reagents.total_volume)
|
||||
reagents.reaction(M, INGEST)
|
||||
spawn(5)
|
||||
@@ -1754,6 +1799,10 @@
|
||||
|
||||
return 0
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
|
||||
if(target.is_open_container() == 1 && target.reagents)
|
||||
@@ -2370,6 +2419,7 @@
|
||||
volume = 50
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
attack_self(mob/user as mob)
|
||||
return
|
||||
@@ -2403,6 +2453,8 @@
|
||||
message_admins("ATTACK: [user] ([user.ckey]) fed [M] ([M.ckey]) with [src].")
|
||||
|
||||
|
||||
// log_attack("<font color='red'>[user.name] ([user.ckey]) fed [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
|
||||
if(reagents.total_volume)
|
||||
reagents.reaction(M, INGEST)
|
||||
spawn(5)
|
||||
@@ -2413,6 +2465,7 @@
|
||||
return 0
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
|
||||
return
|
||||
|
||||
afterattack(obj/target, mob/user , flag)
|
||||
@@ -2463,7 +2516,7 @@
|
||||
icon_state = "soysauce"
|
||||
if("frostoil")
|
||||
name = "Coldsauce"
|
||||
desc = "Leaves the tongue numb in it's passage."
|
||||
desc = "Leaves the tongue numb in its passage."
|
||||
icon_state = "coldsauce"
|
||||
if("sodiumchloride")
|
||||
name = "Salt Shaker"
|
||||
@@ -2566,7 +2619,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/tea
|
||||
name = "Duke Purple Tea"
|
||||
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
|
||||
desc = "A refreshingly quaint drink, served piping hot."
|
||||
icon_state = "tea"
|
||||
New()
|
||||
..()
|
||||
@@ -2587,7 +2640,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/h_chocolate
|
||||
name = "Dutch Hot Coco"
|
||||
desc = "Made in Space South America."
|
||||
icon_state = "tea"
|
||||
icon_state = "hotchocolate"
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("hot_coco", 30)
|
||||
@@ -2776,7 +2829,7 @@
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater
|
||||
name = "Flask of Holy Water"
|
||||
desc = "A flask of the chaplains holy water."
|
||||
desc = "A flask of the chaplain's holy water."
|
||||
icon_state = "holyflask"
|
||||
New()
|
||||
..()
|
||||
@@ -2984,6 +3037,25 @@
|
||||
..()
|
||||
reagents.add_reagent("fuel",1000)
|
||||
|
||||
|
||||
bullet_act(var/obj/item/projectile/Proj)
|
||||
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
|
||||
|
||||
blob_act()
|
||||
explosion(src.loc,0,1,5,7,10)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
ex_act()
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
/obj/structure/reagent_dispensers/peppertank
|
||||
name = "Pepper Spray Refiller"
|
||||
desc = "Refill pepper spray canisters."
|
||||
@@ -2991,27 +3063,11 @@
|
||||
icon_state = "peppertank"
|
||||
anchored = 1
|
||||
density = 0
|
||||
amount_per_transfer_from_this = 30
|
||||
amount_per_transfer_from_this = 45
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("condensedcapsaicin",1000)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/blob_act()
|
||||
explosion(src.loc,0,1,5,7,10)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/ex_act()
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
|
||||
/obj/structure/reagent_dispensers/fueltank/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
||||
if(temperature > T0C+500)
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(src)
|
||||
del(src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/reagent_dispensers/water_cooler
|
||||
name = "Water-Cooler"
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
|
||||
proc/UpdateDamage()
|
||||
health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + cloneloss)
|
||||
health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -315,10 +315,10 @@
|
||||
overlays = null
|
||||
|
||||
if(buckled)
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
lying = 1
|
||||
else
|
||||
if(istype(buckled, /obj/structure/stool/bed/chair))
|
||||
lying = 0
|
||||
else
|
||||
lying = 1
|
||||
|
||||
// Automatically drop anything in store / id / belt if you're not wearing a uniform.
|
||||
if (zone_sel)
|
||||
|
||||
@@ -28,13 +28,16 @@
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
/*if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(prob(70))
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
/*if(prob(70))
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if(M.client)
|
||||
M << "\red <B>[src] fails to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return*/
|
||||
if(tmob.nopush)
|
||||
now_pushing = 0
|
||||
return
|
||||
tmob.LAssailant = src
|
||||
|
||||
now_pushing = 0
|
||||
@@ -109,7 +112,7 @@
|
||||
ear_damage += 15
|
||||
ear_deaf += 60
|
||||
|
||||
bruteloss += b_loss
|
||||
adjustBruteLoss(b_loss)
|
||||
adjustFireLoss(f_loss)
|
||||
|
||||
updatehealth()
|
||||
@@ -150,7 +153,7 @@
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message(text("\red [] has been hit by []", src, O), 1)
|
||||
if (health > 0)
|
||||
bruteloss += (istype(O, /obj/effect/meteor/small) ? 10 : 25)
|
||||
adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
|
||||
adjustFireLoss(30)
|
||||
|
||||
updatehealth()
|
||||
@@ -249,9 +252,7 @@
|
||||
else
|
||||
m_select.screen_loc = null
|
||||
|
||||
if(client && client.admin_invis)
|
||||
invisibility = 100
|
||||
else if (alien_invis)
|
||||
if (alien_invis)
|
||||
invisibility = 2
|
||||
if(istype(loc, /turf))//If they are standing on a turf.
|
||||
AddCamoOverlay(loc)//Overlay camo.
|
||||
@@ -280,12 +281,25 @@
|
||||
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
|
||||
var/damage = rand(1, 3)
|
||||
|
||||
bruteloss += damage
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
updatehealth()
|
||||
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[M]</B> [M.attacktext] [src]!", 1)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/alien/larva/attack_paw(mob/living/carbon/monkey/M as mob)
|
||||
if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
|
||||
|
||||
@@ -310,7 +324,7 @@
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[M.name] has bit [src]!</B>"), 1)
|
||||
bruteloss += rand(1, 3)
|
||||
adjustBruteLoss(rand(1, 3))
|
||||
updatehealth()
|
||||
return
|
||||
|
||||
@@ -335,7 +349,7 @@
|
||||
else
|
||||
damage = rand(5, 35)
|
||||
|
||||
bruteloss += damage
|
||||
adjustBruteLoss(damage)
|
||||
|
||||
|
||||
updatehealth()
|
||||
@@ -449,7 +463,7 @@
|
||||
for(var/mob/O in viewers(M, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has weakened []!</B>", M, src), 1, "\red You hear someone fall.", 2)
|
||||
bruteloss += damage
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
if(M.type != /mob/living/carbon/human/tajaran)
|
||||
@@ -492,7 +506,7 @@
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[M.name] has bit []!</B>", src), 1)
|
||||
bruteloss += damage
|
||||
adjustBruteLoss(damage)
|
||||
updatehealth()
|
||||
else
|
||||
M << "\green <B>[name] is too injured for that.</B>"
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
|
||||
|
||||
//Account for massive pressure differences
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
|
||||
@@ -171,7 +172,7 @@
|
||||
if(health <= 20 && prob(1)) spawn(0) emote("gasp")
|
||||
|
||||
//if(!rejuv) oxyloss++
|
||||
if(!reagents.has_reagent("inaprovaline")) oxyloss++
|
||||
if(!reagents.has_reagent("inaprovaline")) adjustOxyLoss(1)
|
||||
|
||||
if(stat != 2) stat = 1
|
||||
Paralyse(5)
|
||||
|
||||
@@ -82,3 +82,16 @@
|
||||
world.Reboot()
|
||||
|
||||
return ..(gibbed)
|
||||
|
||||
/mob/living/carbon/human/proc/ChangeToHusk()
|
||||
if(mutations & HUSK)
|
||||
return
|
||||
mutations |= HUSK
|
||||
real_name = "Unknown"
|
||||
update_body()
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/Drain()
|
||||
ChangeToHusk()
|
||||
mutations2 |= NOCLONE
|
||||
return
|
||||
@@ -478,6 +478,11 @@
|
||||
mymob.oxygen.name = "oxygen"
|
||||
mymob.oxygen.screen_loc = ui_oxygen
|
||||
|
||||
mymob.pressure = new /obj/screen( null )
|
||||
mymob.pressure.icon = 'screen1_old.dmi'
|
||||
mymob.pressure.icon_state = "pressure0"
|
||||
mymob.pressure.name = "pressure"
|
||||
mymob.pressure.screen_loc = ui_pressure
|
||||
/*
|
||||
mymob.i_select = new /obj/screen( null )
|
||||
mymob.i_select.icon_state = "selector"
|
||||
@@ -669,7 +674,7 @@
|
||||
mymob.client.screen = null
|
||||
|
||||
//, mymob.i_select, mymob.m_select
|
||||
mymob.client.screen += list( mymob.pain, mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.pain, mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.nutrition_icon, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.pressure, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
//if(istype(mymob,/mob/living/carbon/monkey)) mymob.client.screen += src.mon_blo
|
||||
|
||||
@@ -162,7 +162,25 @@
|
||||
now_pushing = 1
|
||||
if (ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(tmob.a_intent == "help" && a_intent == "help" && tmob.canmove && canmove) // mutual brohugs all around!
|
||||
|
||||
//BubbleWrap - Should stop you pushing a restrained person out of the way
|
||||
|
||||
if(istype(tmob, /mob/living/carbon/human))
|
||||
|
||||
for(var/mob/M in range(tmob, 1))
|
||||
if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restrained, you cannot push past"
|
||||
now_pushing = 0
|
||||
return
|
||||
if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) )
|
||||
if ( !(world.time % 5) )
|
||||
src << "\red [tmob] is restraining [M], you cannot push past"
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
//BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
|
||||
if((tmob.a_intent == "help" || tmob.restrained()) && (a_intent == "help" || src.restrained()) && tmob.canmove && canmove) // mutual brohugs all around!
|
||||
var/turf/oldloc = loc
|
||||
loc = tmob.loc
|
||||
tmob.loc = oldloc
|
||||
@@ -174,10 +192,20 @@
|
||||
|
||||
/*if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(prob(40) && !(mutations & FAT))
|
||||
visible_message("\red <B>[src] fails to push [tmob]'s fat ass out of the way.</B>", \
|
||||
"\red <B>You fail to push [tmob]'s fat ass out of the way.</B>")
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return*/
|
||||
if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
|
||||
if(prob(99))
|
||||
now_pushing = 0
|
||||
return
|
||||
if(tmob.nopush)
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
|
||||
@@ -866,10 +894,10 @@
|
||||
update_body()
|
||||
|
||||
if(buckled)
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
lying = 1
|
||||
else
|
||||
if(istype(buckled, /obj/structure/stool/bed/chair))
|
||||
lying = 0
|
||||
else
|
||||
lying = 1
|
||||
|
||||
// Automatically drop anything in store / id / belt if you're not wearing a uniform.
|
||||
if (!w_uniform)
|
||||
@@ -1249,6 +1277,19 @@
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
M.emote("[M.friendly] [src]")
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[M]</B> [M.attacktext] [src]!", 1)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
|
||||
var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
|
||||
var/armor = run_armor_check(affecting, "melee")
|
||||
apply_damage(damage, BRUTE, affecting, armor)
|
||||
if(armor >= 2) return
|
||||
|
||||
|
||||
/mob/living/carbon/human/attack_metroid(mob/living/carbon/metroid/M as mob)
|
||||
if(M.Victim) return // can't attack while eating!
|
||||
@@ -2169,7 +2210,7 @@ It can still be worn/put on as normal.
|
||||
if ((target.health >= -99.0 && target.stat == 1))
|
||||
target.cpr_time = world.time
|
||||
var/suff = min(target.getOxyLoss(), 7)
|
||||
target.oxyloss -= suff
|
||||
target.adjustOxyLoss(-suff)
|
||||
target.losebreath = 0
|
||||
target.updatehealth()
|
||||
for(var/mob/O in viewers(source, null))
|
||||
@@ -2253,6 +2294,9 @@ It can still be worn/put on as normal.
|
||||
else
|
||||
if(source)
|
||||
source.update_clothing()
|
||||
spawn(0)
|
||||
if(source.machine == target)
|
||||
target.show_inv(source)
|
||||
if(target)
|
||||
target.update_clothing()
|
||||
//SN src = null
|
||||
|
||||
@@ -93,6 +93,9 @@
|
||||
//Disabilities
|
||||
handle_disabilities()
|
||||
|
||||
//Random events (vomiting etc)
|
||||
handle_random_events()
|
||||
|
||||
//Status updates, death etc.
|
||||
UpdateLuminosity()
|
||||
handle_regular_status_updates()
|
||||
@@ -105,6 +108,9 @@
|
||||
if(client)
|
||||
handle_regular_hud_updates()
|
||||
|
||||
//Being buckled to a chair or bed
|
||||
check_if_buckled()
|
||||
|
||||
// Yup.
|
||||
update_canmove()
|
||||
|
||||
@@ -451,7 +457,7 @@
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
if(reagents.has_reagent("inaprovaline"))
|
||||
return
|
||||
oxyloss += HUMAN_MAX_OXYLOSS
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
|
||||
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
|
||||
@@ -481,10 +487,10 @@
|
||||
spawn(0) emote("gasp")
|
||||
if(O2_pp > 0)
|
||||
var/ratio = safe_oxygen_min/O2_pp
|
||||
oxyloss += min(5*ratio, HUMAN_MAX_OXYLOSS) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
|
||||
adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
|
||||
oxygen_used = breath.oxygen*ratio/6
|
||||
else
|
||||
oxyloss += HUMAN_MAX_OXYLOSS
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
/*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose)
|
||||
spawn(0) emote("cough")
|
||||
@@ -493,7 +499,7 @@
|
||||
oxygen_used = breath.oxygen*ratio/6
|
||||
oxygen_alert = max(oxygen_alert, 1)*/
|
||||
else // We're in safe limits
|
||||
oxyloss = max(getOxyLoss()-5, 0)
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_used = breath.oxygen/6
|
||||
oxygen_alert = 0
|
||||
|
||||
@@ -505,9 +511,9 @@
|
||||
co2overloadtime = world.time
|
||||
else if(world.time - co2overloadtime > 120)
|
||||
Paralyse(3)
|
||||
oxyloss += 3 // Lets hurt em a little, let them know we mean business
|
||||
adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
|
||||
if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
|
||||
oxyloss += 8
|
||||
adjustOxyLoss(8)
|
||||
if(prob(20) && isbreathing) // Lets give them some chance to know somethings not right though I guess.
|
||||
spawn(0) emote("cough")
|
||||
|
||||
@@ -640,7 +646,17 @@
|
||||
bodytemperature += 0.8*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
|
||||
*/
|
||||
|
||||
//Account for massive pressure differences
|
||||
//Account for massive pressure differences. Done by Polymorph
|
||||
var/pressure = environment.return_pressure()
|
||||
if(!istype(wear_suit, /obj/item/clothing/suit/space)&&!istype(wear_suit, /obj/item/clothing/suit/armor/captain))
|
||||
/*if(pressure < 20)
|
||||
if(prob(25))
|
||||
src << "You feel the splittle on your lips and the fluid on your eyes boiling away, the capillteries in your skin breaking."
|
||||
adjustBruteLoss(5)
|
||||
*/
|
||||
if(pressure > HAZARD_HIGH_PRESSURE)
|
||||
adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE))
|
||||
|
||||
return //TODO: DEFERRED
|
||||
|
||||
adjust_body_temperature(current, loc_temp, boost)
|
||||
@@ -759,14 +775,9 @@
|
||||
if(nutrition < 500) //so they can't store nutrition to survive without light forever
|
||||
nutrition += light_amount
|
||||
if(light_amount > 0) //if there's enough light, heal
|
||||
if(getFireLoss())
|
||||
heal_overall_damage(0,1)
|
||||
if(getBruteLoss())
|
||||
heal_overall_damage(1,0)
|
||||
heal_overall_damage(1,1)
|
||||
adjustToxLoss(-1)
|
||||
|
||||
if(getOxyLoss())
|
||||
oxyloss--
|
||||
adjustOxyLoss(-1)
|
||||
|
||||
/*if(overeatduration > 500 && !(mutations & FAT))
|
||||
src << "\red You suddenly feel blubbery!"
|
||||
@@ -891,19 +902,25 @@
|
||||
if(getOxyLoss() > 50) Paralyse(3)
|
||||
|
||||
if(sleeping)
|
||||
Paralyse(3)
|
||||
// adjustHalLoss(-5)
|
||||
if(paralysis <= 0)
|
||||
Paralyse(2)
|
||||
if (prob(10) && health && !hal_crit) spawn(0) emote("snore")
|
||||
if(!src.sleeping_willingly)
|
||||
src.sleeping--
|
||||
|
||||
if(resting)
|
||||
Weaken(3)
|
||||
if(weakened <= 0)
|
||||
Weaken(2)
|
||||
|
||||
if(health < config.health_threshold_dead || brain_op_stage == 4.0)
|
||||
death()
|
||||
else if(health < config.health_threshold_crit)
|
||||
if(health <= 20 && prob(1)) spawn(0) emote("gasp")
|
||||
|
||||
//if(!rejuv) oxyloss++
|
||||
if(!reagents.has_reagent("inaprovaline")) adjustOxyLoss(1)
|
||||
|
||||
if(stat != 2) stat = 1
|
||||
Paralyse(5)
|
||||
|
||||
@@ -1134,7 +1151,7 @@
|
||||
|
||||
if (healths)
|
||||
if (stat != 2)
|
||||
switch(health)
|
||||
switch(health - halloss)
|
||||
if(100 to INFINITY)
|
||||
healths.icon_state = "health0"
|
||||
if(80 to 100)
|
||||
@@ -1168,6 +1185,24 @@
|
||||
nutrition_icon.icon_state = "nutrition3"
|
||||
else
|
||||
nutrition_icon.icon_state = "nutrition4"
|
||||
if (pressure)
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/space)||istype(wear_suit, /obj/item/clothing/suit/armor/captain))
|
||||
pressure.icon_state = "pressure0"
|
||||
|
||||
else
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
if(environment)
|
||||
switch(environment.return_pressure())
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
pressure.icon_state = "pressure2"
|
||||
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
|
||||
pressure.icon_state = "pressure1"
|
||||
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
|
||||
pressure.icon_state = "pressure0"
|
||||
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
|
||||
pressure.icon_state = "pressure-1"
|
||||
else
|
||||
pressure.icon_state = "pressure-2"
|
||||
|
||||
if(pullin) pullin.icon_state = "pull[pulling ? 1 : 0]"
|
||||
|
||||
@@ -1201,6 +1236,7 @@
|
||||
else
|
||||
bodytemp.icon_state = "temp-4"
|
||||
|
||||
if(!client) return 0 //Wish we did not need these
|
||||
client.screen -= hud_used.blurry
|
||||
client.screen -= hud_used.druggy
|
||||
client.screen -= hud_used.vimpaired
|
||||
@@ -1225,6 +1261,14 @@
|
||||
if(!head:up && tinted_weldhelh)
|
||||
client.screen += hud_used.darkMask
|
||||
|
||||
if(eye_stat > 20)
|
||||
if((eye_stat > 30))
|
||||
client.screen += hud_used.darkMask
|
||||
else
|
||||
client.screen += hud_used.vimpaired
|
||||
|
||||
|
||||
|
||||
if (stat != 2)
|
||||
if (machine)
|
||||
if (!( machine.check_eye(src) ))
|
||||
@@ -1237,10 +1281,33 @@
|
||||
return 1
|
||||
|
||||
handle_random_events()
|
||||
/* // probably stupid -- Doohl
|
||||
if (prob(1) && prob(2))
|
||||
spawn(0)
|
||||
emote("sneeze")
|
||||
return
|
||||
*/
|
||||
|
||||
// Puke if toxloss is too high
|
||||
if(!stat)
|
||||
if (getToxLoss() >= 45 && nutrition > 20)
|
||||
lastpuke ++
|
||||
if(lastpuke >= 25) // about 25 second delay I guess
|
||||
Stun(5)
|
||||
|
||||
for(var/mob/O in viewers(world.view, src))
|
||||
O.show_message(text("<b>\red [] throws up!</b>", src), 1)
|
||||
playsound(src.loc, 'splat.ogg', 50, 1)
|
||||
|
||||
var/turf/location = loc
|
||||
if (istype(location, /turf/simulated))
|
||||
location.add_vomit_floor(src, 1)
|
||||
|
||||
nutrition -= 20
|
||||
adjustToxLoss(-3)
|
||||
|
||||
// make it so you can only puke so fast
|
||||
lastpuke = 0
|
||||
|
||||
handle_virus_updates()
|
||||
if(bodytemperature > 406)
|
||||
@@ -1295,13 +1362,13 @@
|
||||
continue
|
||||
if(air_master.current_cycle%3==1)
|
||||
if(!M.nodamage)
|
||||
M.bruteloss += 5
|
||||
M.adjustBruteLoss(5)
|
||||
nutrition += 10
|
||||
|
||||
handle_changeling()
|
||||
if (mind)
|
||||
if (mind.special_role == "Changeling" && changeling)
|
||||
changeling.chem_charges = between(0, (max((0.9 - (changeling.chem_charges / 50)), 0.1) + changeling.chem_charges), 50)
|
||||
changeling.chem_charges = between(0, ((max((0.9 - (changeling.chem_charges / 50)), 0.1)*changeling.chem_recharge_multiplier) + changeling.chem_charges), changeling.chem_storage)
|
||||
if ((changeling.geneticdamage > 0))
|
||||
changeling.geneticdamage = changeling.geneticdamage-1
|
||||
|
||||
@@ -1341,3 +1408,66 @@
|
||||
src << "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")
|
||||
else if(shock_stage == 80)
|
||||
src << "<font color='red'><b>"+pick("You see a light at the end of the tunnel!", "You feel like you could die any moment now.", "You're about to lose consciousness.")
|
||||
|
||||
/*
|
||||
// Commented out so hunger system won't be such shock
|
||||
// Damage and effect from not eating
|
||||
if(nutrition <= 50)
|
||||
if (prob (0.1))
|
||||
src << "\red Your stomach rumbles."
|
||||
if (prob (10))
|
||||
bruteloss++
|
||||
if (prob (5))
|
||||
src << "You feel very weak."
|
||||
weakened += rand(2, 3)
|
||||
*/
|
||||
/*
|
||||
snippets
|
||||
|
||||
if (mach)
|
||||
if (machine)
|
||||
mach.icon_state = "mach1"
|
||||
else
|
||||
mach.icon_state = null
|
||||
|
||||
if (!m_flag)
|
||||
moved_recently = 0
|
||||
m_flag = null
|
||||
|
||||
|
||||
|
||||
if ((istype(loc, /turf/space) && !( locate(/obj/movable, loc) )))
|
||||
var/layers = 20
|
||||
// ******* Check
|
||||
if (((istype(head, /obj/item/clothing/head) && head.flags & 4) || (istype(wear_mask, /obj/item/clothing/mask) && (!( wear_mask.flags & 4 ) && wear_mask.flags & 8))))
|
||||
layers -= 5
|
||||
if (istype(w_uniform, /obj/item/clothing/under))
|
||||
layers -= 5
|
||||
if ((istype(wear_suit, /obj/item/clothing/suit) && wear_suit.flags & 8))
|
||||
layers -= 10
|
||||
if (layers > oxcheck)
|
||||
oxcheck = layers
|
||||
|
||||
|
||||
if(bodytemperature < 282.591 && (!firemut))
|
||||
if(bodytemperature < 250)
|
||||
adjustFireLoss(4)
|
||||
updatehealth()
|
||||
if(paralysis <= 2) paralysis += 2
|
||||
else if(prob(1) && !paralysis)
|
||||
if(paralysis <= 5) paralysis += 5
|
||||
emote("collapse")
|
||||
src << "\red You collapse from the cold!"
|
||||
if(bodytemperature > 327.444 && (!firemut))
|
||||
if(bodytemperature > 345.444)
|
||||
if(!eye_blurry) src << "\red The heat blurs your vision!"
|
||||
eye_blurry = max(4, eye_blurry)
|
||||
if(prob(3)) adjustFireLoss(rand(1,2))
|
||||
else if(prob(3) && !paralysis)
|
||||
paralysis += 2
|
||||
emote("collapse")
|
||||
src << "\red You collapse from heat exaustion!"
|
||||
plcheck = t_plasma
|
||||
oxcheck = t_oxygen
|
||||
G.turf_add(T, G.total_moles())
|
||||
*/
|
||||
|
||||
@@ -390,6 +390,12 @@
|
||||
mymob.oxygen.name = "oxygen"
|
||||
mymob.oxygen.screen_loc = ui_oxygen
|
||||
|
||||
mymob.pressure = new /obj/screen( null )
|
||||
mymob.pressure.icon = 'screen1_old.dmi'
|
||||
mymob.pressure.icon_state = "pressure0"
|
||||
mymob.pressure.name = "pressure"
|
||||
mymob.pressure.screen_loc = ui_pressure
|
||||
|
||||
/*
|
||||
mymob.i_select = new /obj/screen( null )
|
||||
mymob.i_select.icon_state = "selector"
|
||||
@@ -401,7 +407,6 @@
|
||||
mymob.m_select.name = "moving"
|
||||
mymob.m_select.screen_loc = "16:-11,14"
|
||||
*/
|
||||
|
||||
mymob.toxin = new /obj/screen( null )
|
||||
mymob.toxin.icon = ui_style
|
||||
mymob.toxin.icon_state = "tox0"
|
||||
@@ -569,7 +574,7 @@
|
||||
mymob.client.screen = null
|
||||
|
||||
//, mymob.i_select, mymob.m_select
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.bodytemp, mymob.internals, mymob.fire, mymob.hands, mymob.healths, mymob.pullin, mymob.blind, mymob.flash, mymob.rest, mymob.sleep, mymob.pressure, mymob.gun_setting_icon) //, mymob.mach )
|
||||
mymob.client.screen += src.adding + src.other
|
||||
|
||||
//if(istype(mymob,/mob/living/carbon/monkey)) mymob.client.screen += src.mon_blo
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
//to find it.
|
||||
src.blinded = null
|
||||
|
||||
|
||||
//Disease Check
|
||||
handle_virus_updates()
|
||||
|
||||
@@ -260,7 +259,7 @@
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
oxyloss += 7
|
||||
adjustOxyLoss(7)
|
||||
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
|
||||
@@ -288,7 +287,7 @@
|
||||
if (O2_pp == 0)
|
||||
O2_pp = 0.01
|
||||
var/ratio = safe_oxygen_min/O2_pp
|
||||
oxyloss += min(5*ratio, 7) // Don't fuck them up too fast (space only does 7 after all!)
|
||||
adjustOxyLoss(min(5*ratio, 7)) // Don't fuck them up too fast (space only does 7 after all!)
|
||||
oxygen_used = breath.oxygen*ratio/6
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
/*else if (O2_pp > safe_oxygen_max) // Too much oxygen (commented this out for now, I'll deal with pressure damage elsewhere I suppose)
|
||||
@@ -298,7 +297,7 @@
|
||||
oxygen_used = breath.oxygen*ratio/6
|
||||
oxygen_alert = max(oxygen_alert, 1)*/
|
||||
else // We're in safe limits
|
||||
oxyloss = max(getOxyLoss()-5, 0)
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_used = breath.oxygen/6
|
||||
oxygen_alert = 0
|
||||
|
||||
@@ -310,9 +309,9 @@
|
||||
co2overloadtime = world.time
|
||||
else if(world.time - co2overloadtime > 120)
|
||||
Paralyse(3)
|
||||
oxyloss += 3 // Lets hurt em a little, let them know we mean business
|
||||
adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
|
||||
if(world.time - co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
|
||||
oxyloss += 8
|
||||
adjustOxyLoss(8)
|
||||
if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
|
||||
spawn(0) emote("cough")
|
||||
|
||||
@@ -368,8 +367,21 @@
|
||||
|
||||
if(stat==2)
|
||||
bodytemperature += 0.1*(environment.temperature - bodytemperature)*environment_heat_capacity/(environment_heat_capacity + 270000)
|
||||
|
||||
//Account for massive pressure differences
|
||||
var/pressure = environment.return_pressure()
|
||||
|
||||
// if(!wear_suit) Monkies cannot into space.
|
||||
// if(!istype(wear_suit, /obj/item/clothing/suit/space))
|
||||
|
||||
/*if(pressure < 20)
|
||||
if(prob(25))
|
||||
src << "You feel the splittle on your lips and the fluid on your eyes boiling away, the capillteries in your skin breaking."
|
||||
adjustBruteLoss(5)
|
||||
*/
|
||||
|
||||
if(pressure > HAZARD_HIGH_PRESSURE)
|
||||
|
||||
adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE))
|
||||
return //TODO: DEFERRED
|
||||
|
||||
handle_temperature_damage(body_part, exposed_temperature, exposed_intensity)
|
||||
@@ -423,8 +435,8 @@
|
||||
else if(src.health < config.health_threshold_crit)
|
||||
if(src.health <= 20 && prob(1)) spawn(0) emote("gasp")
|
||||
|
||||
if(!src.rejuv) src.oxyloss++
|
||||
if(!src.reagents.has_reagent("inaprovaline")) src.oxyloss++
|
||||
//if(!src.rejuv) src.oxyloss++ //-Nodrak (I can't believe I thought this should be commented back in)
|
||||
if(!src.reagents.has_reagent("inaprovaline") && src.stat != 2) src.adjustOxyLoss(2)
|
||||
|
||||
if(src.stat != 2) src.stat = 1
|
||||
Paralyse(5)
|
||||
@@ -530,6 +542,21 @@
|
||||
src.healths.icon_state = "health6"
|
||||
else
|
||||
src.healths.icon_state = "health7"
|
||||
if (pressure)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
if(environment)
|
||||
switch(environment.return_pressure())
|
||||
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
pressure.icon_state = "pressure2"
|
||||
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
|
||||
pressure.icon_state = "pressure1"
|
||||
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
|
||||
pressure.icon_state = "pressure0"
|
||||
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
|
||||
pressure.icon_state = "pressure-1"
|
||||
else
|
||||
pressure.icon_state = "pressure-2"
|
||||
|
||||
if(src.pullin) src.pullin.icon_state = "pull[src.pulling ? 1 : 0]"
|
||||
|
||||
@@ -625,6 +652,6 @@
|
||||
handle_changeling()
|
||||
if (mind)
|
||||
if (mind.special_role == "Changeling" && changeling)
|
||||
changeling.chem_charges = between(0, (max((0.9 - (changeling.chem_charges / 50)), 0.1) + changeling.chem_charges), 50)
|
||||
changeling.chem_charges = between(0, ((max((0.9 - (changeling.chem_charges / 50)), 0.1)*changeling.chem_recharge_multiplier) + changeling.chem_charges), changeling.chem_storage)
|
||||
if ((changeling.geneticdamage > 0))
|
||||
changeling.geneticdamage = changeling.geneticdamage-1
|
||||
@@ -452,10 +452,10 @@
|
||||
|
||||
/mob/living/carbon/monkey/update_clothing()
|
||||
if(buckled)
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
lying = 1
|
||||
else
|
||||
if(istype(buckled, /obj/structure/stool/bed/chair))
|
||||
lying = 0
|
||||
else
|
||||
lying = 1
|
||||
|
||||
if(update_icon) // Skie
|
||||
..()
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
log_access("Login: [key_name(src)] from [src.client.address ? src.client.address : "localhost"]")
|
||||
src.lastKnownIP = src.client.address
|
||||
src.computer_id = src.client.computer_id
|
||||
if(!src.client.midis || !src.midis)
|
||||
src.client.midis = 0
|
||||
src.midis = 0
|
||||
if (config.log_access)
|
||||
for (var/mob/M in world)
|
||||
if(M == src)
|
||||
|
||||
527
code/modules/mob/mob_defines.dm
Normal file
527
code/modules/mob/mob_defines.dm
Normal file
@@ -0,0 +1,527 @@
|
||||
/mob
|
||||
density = 1
|
||||
layer = 4.0
|
||||
animate_movement = 2
|
||||
// flags = NOREACT
|
||||
//THE SOLUTION BUBBLES was funnier.
|
||||
var/datum/mind/mind
|
||||
|
||||
|
||||
|
||||
|
||||
//MOB overhaul
|
||||
|
||||
//Not in use yet
|
||||
// var/obj/organstructure/organStructure = null
|
||||
|
||||
//Vars that have been relocated to organStructure
|
||||
//Vars that have been relocated to organStructure ++END
|
||||
|
||||
|
||||
|
||||
//Vars that should only be accessed via procs
|
||||
var/bruteloss = 0.0//Living
|
||||
var/oxyloss = 0.0//Living
|
||||
var/toxloss = 0.0//Living
|
||||
var/fireloss = 0.0//Living
|
||||
var/cloneloss = 0//Carbon
|
||||
var/brainloss = 0//Carbon
|
||||
var/maxHealth = 100 //Living
|
||||
//Vars that should only be accessed via procs ++END
|
||||
|
||||
// var/uses_hud = 0
|
||||
var/obj/screen/pain = null
|
||||
var/obj/screen/flash = null
|
||||
var/obj/screen/blind = null
|
||||
var/obj/screen/hands = null
|
||||
var/obj/screen/mach = null
|
||||
var/obj/screen/sleep = null
|
||||
var/obj/screen/rest = null
|
||||
var/obj/screen/pullin = null
|
||||
var/obj/screen/internals = null
|
||||
var/obj/screen/oxygen = null
|
||||
var/obj/screen/i_select = null
|
||||
var/obj/screen/m_select = null
|
||||
var/obj/screen/toxin = null
|
||||
var/obj/screen/fire = null
|
||||
var/obj/screen/bodytemp = null
|
||||
var/obj/screen/healths = null
|
||||
var/obj/screen/throw_icon = null
|
||||
var/obj/screen/nutrition_icon = null
|
||||
var/obj/screen/pressure = null
|
||||
var/obj/screen/gun/item/item_use_icon = null
|
||||
var/obj/screen/gun/move/gun_move_icon = null
|
||||
var/obj/screen/gun/run/gun_run_icon = null
|
||||
var/obj/screen/gun/mode/gun_setting_icon = null
|
||||
|
||||
var/total_luminosity = 0 //This controls luminosity for mobs, when you pick up lights and such this is edited. If you want the mob to use lights it must update its lum in its life proc or such. Note clamp this value around 7 or such to prevent massive light lag.
|
||||
var/last_luminosity = 0
|
||||
|
||||
/*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob.
|
||||
A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such.
|
||||
The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs).
|
||||
I'll make some notes on where certain variable defines should probably go.
|
||||
Changing this around would probably require a good look-over the pre-existing code.
|
||||
*/
|
||||
//var/midis = 1 //Check if midis should be played for someone - no, this is something that is tied to clients, not mobs.
|
||||
var/alien_egg_flag = 0//Have you been infected?
|
||||
var/last_special = 0
|
||||
var/obj/screen/zone_sel/zone_sel = null
|
||||
|
||||
var/emote_allowed = 1
|
||||
var/computer_id = null
|
||||
var/lastattacker = null
|
||||
var/lastattacked = null
|
||||
var/attack_log = list( )
|
||||
var/already_placed = 0.0
|
||||
var/obj/machinery/machine = null
|
||||
var/other_mobs = null
|
||||
var/memory = ""
|
||||
var/poll_answer = 0.0
|
||||
var/sdisabilities = 0//Carbon
|
||||
var/disabilities = 0//Carbon
|
||||
var/atom/movable/pulling = null
|
||||
var/stat = 0.0
|
||||
var/next_move = null
|
||||
var/prev_move = null
|
||||
var/monkeyizing = null//Carbon
|
||||
var/other = 0.0
|
||||
var/hand = null
|
||||
var/eye_blind = null//Carbon
|
||||
var/eye_blurry = null//Carbon
|
||||
var/ear_deaf = null//Carbon
|
||||
var/ear_damage = null//Carbon
|
||||
var/stuttering = null//Carbon
|
||||
var/slurring = null
|
||||
var/real_name = null
|
||||
var/original_name = null //Original name is only used in ghost chat! It is not to be edited by anything!
|
||||
var/flavor_text = ""
|
||||
var/blinded = null
|
||||
var/bhunger = 0//Carbon
|
||||
var/ajourn = 0
|
||||
var/rejuv = null
|
||||
var/druggy = 0//Carbon
|
||||
var/confused = 0//Carbon
|
||||
var/antitoxs = null
|
||||
var/plasma = null
|
||||
var/sleeping = 0.0//Carbon
|
||||
var/sleeping_willingly = 0.0 //Carbon, allows people to sleep forever if desired
|
||||
var/admin_observing = 0.0
|
||||
var/resting = 0.0//Carbon
|
||||
var/lying = 0.0
|
||||
var/canmove = 1.0
|
||||
var/eye_stat = null//Living, potentially Carbon
|
||||
var/lastpuke = 0
|
||||
|
||||
var/name_archive //For admin things like possession
|
||||
|
||||
var/timeofdeath = 0.0//Living
|
||||
var/cpr_time = 1.0//Carbon
|
||||
var/health = 100//Living
|
||||
|
||||
var/bodytemperature = 310.055 //98.7 F
|
||||
var/drowsyness = 0.0//Carbon
|
||||
var/dizziness = 0//Carbon
|
||||
var/is_dizzy = 0
|
||||
var/is_jittery = 0
|
||||
var/jitteriness = 0//Carbon
|
||||
var/charges = 0.0
|
||||
var/nutrition = 400.0//Carbon
|
||||
var/overeatduration = 0 // How long this guy is overeating //Carbon
|
||||
var/paralysis = 0.0
|
||||
var/stunned = 0.0
|
||||
var/weakened = 0.0
|
||||
var/losebreath = 0.0//Carbon
|
||||
var/intent = null//Living
|
||||
var/shakecamera = 0
|
||||
var/a_intent = "help"//Living
|
||||
var/m_int = null//Living
|
||||
var/m_intent = "run"//Living
|
||||
var/lastDblClick = 0
|
||||
var/lastKnownIP = null
|
||||
var/obj/structure/stool/bed/buckled = null//Living
|
||||
var/obj/item/weapon/handcuffs/handcuffed = null//Living
|
||||
var/obj/item/l_hand = null//Living
|
||||
var/obj/item/r_hand = null//Living
|
||||
var/obj/item/weapon/back = null//Human/Monkey
|
||||
var/obj/item/weapon/tank/internal = null//Human/Monkey
|
||||
var/obj/item/weapon/storage/s_active = null//Carbon
|
||||
var/obj/item/clothing/mask/wear_mask = null//Carbon
|
||||
var/r_epil = 0
|
||||
var/r_ch_cou = 0
|
||||
var/r_Tourette = 0//Carbon
|
||||
|
||||
var/seer = 0 //for cult//Carbon, probably Human
|
||||
|
||||
var/miming = null //checks if the guy is a mime//Human
|
||||
var/silent = null //Can't talk. Value goes down every life proc.//Human
|
||||
|
||||
var/obj/hud/hud_used = null
|
||||
|
||||
//var/list/organs = list( ) //moved to human.
|
||||
var/list/grabbed_by = list( )
|
||||
var/list/requests = list( )
|
||||
|
||||
var/list/mapobjs = list()
|
||||
|
||||
var/in_throw_mode = 0
|
||||
|
||||
var/coughedtime = null
|
||||
|
||||
var/inertia_dir = 0
|
||||
var/footstep = 1
|
||||
|
||||
var/music_lastplayed = "null"
|
||||
|
||||
var/job = null//Living
|
||||
|
||||
var/nodamage = 0
|
||||
var/logged_in = 0
|
||||
|
||||
var/underwear = 1//Human
|
||||
var/backbag = 2//Human
|
||||
var/be_syndicate = 0//This really should be a client variable.
|
||||
var/be_random_name = 0
|
||||
var/const/blindness = 1//Carbon
|
||||
var/const/deafness = 2//Carbon
|
||||
var/const/muteness = 4//Carbon
|
||||
|
||||
|
||||
var/datum/dna/dna = null//Carbon
|
||||
var/radiation = 0.0//Carbon
|
||||
|
||||
var/mutations = 0//Carbon
|
||||
var/mutations2 = 0//Carbon
|
||||
//telekinesis = 1
|
||||
//firemut = 2
|
||||
//xray = 4
|
||||
//hulk = 8
|
||||
//clumsy = 16
|
||||
//obese = 32
|
||||
//husk = 64
|
||||
|
||||
var/voice_name = "unidentifiable voice"
|
||||
var/voice_message = null // When you are not understood by others (replaced with just screeches, hisses, chimpers etc.)
|
||||
var/say_message = null // When you are understood by others. Currently only used by aliens and monkeys in their say_quote procs
|
||||
|
||||
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
|
||||
var/proc_holder_list[] = list()//Right now unused.
|
||||
//Also unlike the spell list, this would only store the object in contents, not an object in itself.
|
||||
|
||||
/* Add this line to whatever stat module you need in order to use the proc holder list.
|
||||
Unlike the object spell system, it's also possible to attach verb procs from these objects to right-click menus.
|
||||
This requires creating a verb for the object proc holder.
|
||||
|
||||
if (proc_holder_list.len)//Generic list for proc_holder objects.
|
||||
for(var/obj/effect/proc_holder/P in proc_holder_list)
|
||||
statpanel("[P.panel]","",P)
|
||||
*/
|
||||
|
||||
//The last mob/living/carbon to push/drag/grab this mob (mostly used by Metroids friend recognition)
|
||||
var/mob/living/carbon/LAssailant = null
|
||||
|
||||
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
|
||||
var/obj/effect/proc_holder/spell/list/spell_list = list()
|
||||
|
||||
//Changlings, but can be used in other modes
|
||||
var/obj/effect/proc_holder/changpower/list/power_list = list()
|
||||
|
||||
//List of active diseases
|
||||
|
||||
var/viruses = list() // replaces var/datum/disease/virus
|
||||
|
||||
//Monkey/infected mode
|
||||
var/list/resistances = list()
|
||||
var/datum/disease/virus = null
|
||||
|
||||
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
|
||||
|
||||
/*
|
||||
//Changeling mode stuff//Carbon
|
||||
var/changeling_level = 0
|
||||
var/list/absorbed_dna = list()
|
||||
var/changeling_fakedeath = 0
|
||||
var/chem_charges = 20.00
|
||||
var/sting_range = 1
|
||||
*/
|
||||
var/datum/changeling/changeling = null
|
||||
|
||||
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
|
||||
var/obj/control_object // Hacking in to control objects -- TLE
|
||||
|
||||
var/robot_talk_understand = 0
|
||||
var/alien_talk_understand = 0
|
||||
var/taj_talk_understand = 0
|
||||
//You can guess what these are for. --SkyMarshal
|
||||
var/list/atom/hallucinations = list()
|
||||
var/halloss = 0
|
||||
var/hallucination = 0
|
||||
|
||||
// TG Porting Variables
|
||||
var/canstun = 1 // determines if this mob can be stunned by things
|
||||
var/canweaken = 1 // determines if this mob can be weakened/knocked down by things
|
||||
var/nopush = 0 //Can they be shoved?
|
||||
|
||||
var/area/lastarea = null
|
||||
|
||||
var/digitalcamo = 0 // Can they be tracked by the AI?
|
||||
|
||||
/*For ninjas and others. This variable is checked when a mob moves and I guess it was supposed to allow the mob to move
|
||||
through dense areas, such as walls. Setting density to 0 does the same thing. The difference here is that
|
||||
the mob is also allowed to move without any sort of restriction. For instance, in space or out of holder objects.*/
|
||||
//0 is off, 1 is normal, 2 is for ninjas.
|
||||
var/incorporeal_move = 0
|
||||
|
||||
|
||||
var/update_icon = 1 // Set to 0 if you want that the mob's icon doesn't update when it moves -- Skie
|
||||
// This can be used if you want to change the icon on the fly and want it to stay
|
||||
|
||||
var/UI = 'screen1_old.dmi' // For changing the UI from preferences
|
||||
|
||||
// var/obj/effect/organstructure/organStructure = null //for dem organs
|
||||
var/list/organs = list( ) //List of organs.
|
||||
|
||||
//Singularity wants you!
|
||||
var/grav_delay = 0
|
||||
var/being_strangled = 0
|
||||
|
||||
/mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1)
|
||||
// world << "Contract_disease called by [src] with virus [virus]"
|
||||
if(stat >=2) return
|
||||
if(virus.type in resistances)
|
||||
if(prob(99.9)) return
|
||||
resistances.Remove(virus.type)//the resistance is futile
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
if(istype(D, virus.type))
|
||||
return // two viruses of the same kind can't infect a body at once!!
|
||||
|
||||
|
||||
if(force_species_check)
|
||||
var/fail = 1
|
||||
for(var/name in virus.affected_species)
|
||||
var/mob_type = text2path("/mob/living/carbon/[lowertext(name)]")
|
||||
if(mob_type && istype(src, mob_type))
|
||||
fail = 0
|
||||
break
|
||||
if(fail) return
|
||||
|
||||
if(skip_this == 1)
|
||||
//if(src.virus) < -- this used to replace the current disease. Not anymore!
|
||||
//src.virus.cure(0)
|
||||
|
||||
var/datum/disease/v = new virus.type
|
||||
src.viruses += v
|
||||
v.affected_mob = src
|
||||
v.strain_data = v.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
|
||||
//if(src.virus) //
|
||||
//return //
|
||||
|
||||
|
||||
/*
|
||||
var/list/clothing_areas = list()
|
||||
var/list/covers = list(UPPER_TORSO,LOWER_TORSO,LEGS,FEET,ARMS,HANDS)
|
||||
for(var/Covers in covers)
|
||||
clothing_areas[Covers] = list()
|
||||
|
||||
for(var/obj/item/clothing/Clothing in src)
|
||||
if(Clothing)
|
||||
for(var/Covers in covers)
|
||||
if(Clothing&Covers)
|
||||
clothing_areas[Covers] += Clothing
|
||||
|
||||
*/
|
||||
if(prob(15/virus.permeability_mod)) return //the power of immunity compels this disease!
|
||||
|
||||
var/obj/item/clothing/Cl = null
|
||||
var/passed = 1
|
||||
|
||||
//chances to target this zone
|
||||
var/head_ch
|
||||
var/body_ch
|
||||
var/hands_ch
|
||||
var/feet_ch
|
||||
|
||||
switch(virus.spread_type)
|
||||
if(CONTACT_HANDS)
|
||||
head_ch = 0
|
||||
body_ch = 0
|
||||
hands_ch = 100
|
||||
feet_ch = 0
|
||||
if(CONTACT_FEET)
|
||||
head_ch = 0
|
||||
body_ch = 0
|
||||
hands_ch = 0
|
||||
feet_ch = 100
|
||||
else
|
||||
head_ch = 100
|
||||
body_ch = 100
|
||||
hands_ch = 25
|
||||
feet_ch = 25
|
||||
|
||||
|
||||
var/target_zone = pick(head_ch;1,body_ch;2,hands_ch;3,feet_ch;4)//1 - head, 2 - body, 3 - hands, 4- feet
|
||||
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
switch(target_zone)
|
||||
if(1)
|
||||
if(isobj(H.head))
|
||||
Cl = H.head
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Head pass [passed]"
|
||||
if(passed && isobj(H.wear_mask))
|
||||
Cl = H.wear_mask
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Mask pass [passed]"
|
||||
if(2)//arms and legs included
|
||||
if(isobj(H.wear_suit))
|
||||
Cl = H.wear_suit
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Suit pass [passed]"
|
||||
if(passed && isobj(H.slot_w_uniform))
|
||||
Cl = H.slot_w_uniform
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Uniform pass [passed]"
|
||||
if(3)
|
||||
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
|
||||
Cl = H.wear_suit
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Suit pass [passed]"
|
||||
|
||||
if(passed && isobj(H.gloves))
|
||||
Cl = H.gloves
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Gloves pass [passed]"
|
||||
if(4)
|
||||
if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
|
||||
Cl = H.wear_suit
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Suit pass [passed]"
|
||||
|
||||
if(passed && isobj(H.shoes))
|
||||
Cl = H.shoes
|
||||
passed = prob(Cl.permeability_coefficient*100*virus.permeability_mod)
|
||||
// world << "Shoes pass [passed]"
|
||||
else
|
||||
src << "Something strange's going on, something's wrong."
|
||||
|
||||
/*if("feet")
|
||||
if(H.shoes && istype(H.shoes, /obj/item/clothing/))
|
||||
Cl = H.shoes
|
||||
passed = prob(Cl.permeability_coefficient*100)
|
||||
//
|
||||
world << "Shoes pass [passed]"
|
||||
*/ //
|
||||
else if(istype(src, /mob/living/carbon/monkey))
|
||||
var/mob/living/carbon/monkey/M = src
|
||||
switch(target_zone)
|
||||
if(1)
|
||||
if(M.wear_mask && isobj(M.wear_mask))
|
||||
Cl = M.wear_mask
|
||||
passed = prob(Cl.permeability_coefficient*100+virus.permeability_mod)
|
||||
//world << "Mask pass [passed]"
|
||||
|
||||
if(passed && virus.spread_type == AIRBORNE && internals)
|
||||
passed = (prob(50*virus.permeability_mod))
|
||||
|
||||
if(passed)
|
||||
//world << "Infection in the mob [src]. YAY"
|
||||
|
||||
|
||||
/*
|
||||
var/score = 0
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
if(src:gloves) score += 5
|
||||
if(istype(src:wear_suit, /obj/item/clothing/suit/space)) score += 10
|
||||
if(istype(src:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10
|
||||
if(istype(src:head, /obj/item/clothing/head/helmet/space)) score += 5
|
||||
if(istype(src:head, /obj/item/clothing/head/bio_hood)) score += 5
|
||||
if(wear_mask)
|
||||
score += 5
|
||||
if((istype(src:wear_mask, /obj/item/clothing/mask) || istype(src:wear_mask, /obj/item/clothing/mask/surgical)) && !internal)
|
||||
score += 5
|
||||
if(internal)
|
||||
score += 5
|
||||
if(score > 20)
|
||||
return
|
||||
else if(score == 20 && prob(95))
|
||||
return
|
||||
else if(score >= 15 && prob(75))
|
||||
return
|
||||
else if(score >= 10 && prob(55))
|
||||
return
|
||||
else if(score >= 5 && prob(35))
|
||||
return
|
||||
else if(prob(15))
|
||||
return
|
||||
else*/
|
||||
var/datum/disease/v = new virus.type
|
||||
src.viruses += v
|
||||
v.affected_mob = src
|
||||
v.strain_data = v.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
// ++++ROCKDTBEN++++ MOB PROCS
|
||||
|
||||
/mob/proc/getBruteLoss()
|
||||
return bruteloss
|
||||
|
||||
/mob/proc/adjustBruteLoss(var/amount)
|
||||
bruteloss = max(bruteloss + amount, 0)
|
||||
|
||||
/mob/proc/getOxyLoss()
|
||||
return oxyloss
|
||||
|
||||
/mob/proc/adjustOxyLoss(var/amount)
|
||||
oxyloss = max(oxyloss + amount, 0)
|
||||
|
||||
/mob/proc/setOxyLoss(var/amount)
|
||||
oxyloss = amount
|
||||
|
||||
/mob/proc/getToxLoss()
|
||||
return toxloss
|
||||
|
||||
/mob/proc/adjustToxLoss(var/amount)
|
||||
toxloss = max(toxloss + amount, 0)
|
||||
|
||||
/mob/proc/setToxLoss(var/amount)
|
||||
toxloss = amount
|
||||
|
||||
/mob/proc/getFireLoss()
|
||||
return fireloss
|
||||
|
||||
/mob/proc/adjustFireLoss(var/amount)
|
||||
fireloss = max(fireloss + amount, 0)
|
||||
|
||||
/mob/proc/getCloneLoss()
|
||||
return cloneloss
|
||||
|
||||
/mob/proc/adjustCloneLoss(var/amount)
|
||||
cloneloss = max(cloneloss + amount, 0)
|
||||
|
||||
/mob/proc/setCloneLoss(var/amount)
|
||||
cloneloss = amount
|
||||
|
||||
/mob/proc/getBrainLoss()
|
||||
return brainloss
|
||||
|
||||
/mob/proc/adjustBrainLoss(var/amount)
|
||||
brainloss = max(brainloss + amount, 0)
|
||||
|
||||
/mob/proc/setBrainLoss(var/amount)
|
||||
brainloss = amount
|
||||
|
||||
// ++++ROCKDTBEN++++ MOB PROCS //END
|
||||
|
||||
@@ -169,24 +169,27 @@ proc/setup_skills()
|
||||
|
||||
mob/living/carbon/human/proc/GetSkillClass(points)
|
||||
// skill classes describe how your character compares in total points
|
||||
var/original_points = points
|
||||
points -= min(round((age - 20) / 2.5), 4) // every 2.5 years after 20, one extra skillpoint
|
||||
if(age > 30)
|
||||
points -= round((age - 30) / 5) // every 5 years after 30, one extra skillpoint
|
||||
if(original_points > 0 && points <= 0) points = 1
|
||||
switch(points)
|
||||
if(0)
|
||||
return "Unconfigured"
|
||||
if(1 to 3)
|
||||
return "Talentless"
|
||||
if(1 to 2)
|
||||
return "Terrifying"
|
||||
if(4 to 6)
|
||||
return "Below Average"
|
||||
if(7 to 9)
|
||||
if(7 to 10)
|
||||
return "Average"
|
||||
if(10 to 12)
|
||||
return "Talented"
|
||||
if(13 to 15)
|
||||
return "Extremely Talented"
|
||||
if(16 to 18)
|
||||
if(11 to 14)
|
||||
return "Above Average"
|
||||
if(15 to 18)
|
||||
return "Exceptional"
|
||||
if(19 to 24)
|
||||
return "Genius"
|
||||
if(19 to 21)
|
||||
return "True Genius"
|
||||
if(22 to 1000)
|
||||
if(24 to 1000)
|
||||
return "God"
|
||||
|
||||
|
||||
@@ -202,22 +205,26 @@ proc/show_skill_window(var/mob/user, var/mob/living/carbon/human/M)
|
||||
var/HTML = "<body>"
|
||||
HTML += "<b>Select your Skills</b><br>"
|
||||
HTML += "Current skill level: <b>[M.GetSkillClass(M.used_skillpoints)]</b> ([M.used_skillpoints])<br>"
|
||||
HTML += "<a href=\"byond://?src=\ref[user];skills=1;preferences=1;preconfigured=1;\">Use preconfigured skillset</a><br>"
|
||||
HTML += "<table>"
|
||||
for(var/V in SKILLS)
|
||||
HTML += "<tr><th colspan = 5><b>[V]</b></th></tr>"
|
||||
HTML += "<tr><th colspan = 5><b>[V]</b>"
|
||||
HTML += "</th></tr>"
|
||||
for(var/datum/skill/S in SKILLS[V])
|
||||
var/level = M.skills[S.ID]
|
||||
HTML += "<tr style='text-align:left;'>"
|
||||
HTML += "<th>[S.name]</th>"
|
||||
HTML += "<th><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Layman\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Basic\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Adept\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Expert\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Untrained\]</font></th>"
|
||||
// secondary skills don't have an amateur level
|
||||
if(S.secondary)
|
||||
HTML += "<th></th>"
|
||||
else
|
||||
HTML += "<th><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Amateur\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Trained\]</font></th>"
|
||||
HTML += "<th><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Professional\]</font></th>"
|
||||
HTML += "</tr>"
|
||||
HTML += "</table>"
|
||||
|
||||
user << browse(null, "window=show_skills")
|
||||
user << browse(null, "window=preferences")
|
||||
user << browse(HTML, "window=show_skills;size=600x800")
|
||||
return
|
||||
|
||||
|
||||
@@ -389,28 +389,43 @@
|
||||
if ((!( usr.stat ) && usr.canmove && !( usr.restrained() )))
|
||||
if (usr.internal)
|
||||
usr.internal = null
|
||||
usr << "\blue No longer running on internals."
|
||||
if (usr.internals)
|
||||
usr.internals.icon_state = "internal0"
|
||||
else
|
||||
if (!( istype(usr.wear_mask, /obj/item/clothing/mask) ))
|
||||
return
|
||||
else
|
||||
if (istype(usr.back, /obj/item/weapon/tank))
|
||||
usr.internal = usr.back
|
||||
else if (ishuman(usr) && istype(usr:s_store, /obj/item/weapon/tank))
|
||||
usr.internal = usr:s_store
|
||||
else if (ishuman(usr) && istype(usr:belt, /obj/item/weapon/tank))
|
||||
usr.internal = usr:belt
|
||||
else if (istype(usr.l_hand, /obj/item/weapon/tank))
|
||||
usr.internal = usr.l_hand
|
||||
else if (istype(usr.r_hand, /obj/item/weapon/tank))
|
||||
usr.internal = usr.r_hand
|
||||
if (usr.internal)
|
||||
//for(var/mob/M in viewers(usr, 1))
|
||||
// M.show_message(text("[] is now running on internals.", usr), 1)
|
||||
usr << "You are now running on internals."
|
||||
if (usr.internals)
|
||||
usr.internals.icon_state = "internal1"
|
||||
if(ishuman(usr))
|
||||
if (!( istype(usr.wear_mask, /obj/item/clothing/mask) ))
|
||||
usr << "\red You are not wearing a mask"
|
||||
return
|
||||
else
|
||||
if (istype(usr.back, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr.back] on your back."
|
||||
usr.internal = usr.back
|
||||
else if (ishuman(usr) && istype(usr:s_store, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr:s_store] on your [usr:wear_suit]."
|
||||
usr.internal = usr:s_store
|
||||
else if (ishuman(usr) && istype(usr:belt, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr:belt] on your belt."
|
||||
usr.internal = usr:belt
|
||||
else if (istype(usr:l_store, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr:l_store] in your left pocket."
|
||||
usr.internal = usr:l_store
|
||||
else if (istype(usr:r_store, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr:r_store] in your right pocket."
|
||||
usr.internal = usr:r_store
|
||||
else if (istype(usr.l_hand, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr.l_hand] on your left hand."
|
||||
usr.internal = usr.l_hand
|
||||
else if (istype(usr.r_hand, /obj/item/weapon/tank))
|
||||
usr << "\blue You are now running on internals from the [usr.r_hand] on your right hand."
|
||||
usr.internal = usr.r_hand
|
||||
if (usr.internal)
|
||||
//for(var/mob/M in viewers(usr, 1))
|
||||
// M.show_message(text("[] is now running on internals.", usr), 1)
|
||||
if (usr.internals)
|
||||
usr.internals.icon_state = "internal1"
|
||||
else
|
||||
usr << "\blue You don't have an oxygen tank."
|
||||
if("pull")
|
||||
usr.pulling = null
|
||||
if("sleep")
|
||||
@@ -470,7 +485,7 @@
|
||||
O.show_message(text("\red <B>[] is trying to break the handcuffs!</B>", usr), 1)
|
||||
spawn(0)
|
||||
if(do_after(usr, 50))
|
||||
if(!usr:handcuffed) return
|
||||
if(!usr:handcuffed || usr:buckled) return
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to break the handcuffs!</B>", usr), 1)
|
||||
usr << "\green You successfully break your handcuffs."
|
||||
@@ -496,6 +511,9 @@
|
||||
"The chain jangles a bit.", // - SkyMarshal
|
||||
"\red Hurry up, dammit!", // - SkyMarshal
|
||||
"This is exhausting!") // - SkyMarshal
|
||||
for(var/mob/O in viewers(usr))
|
||||
if(prob(50)) //Reduces spam slightly
|
||||
O.show_message(text("\red [] continues to struggle in their cuffs!", usr), 1)
|
||||
if(!usr:handcuffed) return
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to remove the handcuffs!</B>", usr), 1)
|
||||
@@ -546,7 +564,7 @@
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message(text("\red <B>[] manages to unbuckle themself!</B>", usr), 1)
|
||||
usr << "\blue You successfully unbuckle yourself."
|
||||
usr:buckled.manual_unbuckle_all(usr)
|
||||
usr:buckled.manual_unbuckle(usr)
|
||||
if("module")
|
||||
if(issilicon(usr))
|
||||
if(usr:module)
|
||||
|
||||
331
code/modules/mob/simple_animal/constructs.dm
Normal file
331
code/modules/mob/simple_animal/constructs.dm
Normal file
@@ -0,0 +1,331 @@
|
||||
|
||||
/////////////////Juggernaut///////////////
|
||||
|
||||
/mob/living/simple_animal/constructarmoured
|
||||
name = "Juggernaut"
|
||||
desc = "A possessed suit of armour driven by the will of the restless dead"
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "armour"
|
||||
icon_living = "armour"
|
||||
icon_dead = "shade_dead"
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
speak_emote = list("hisses")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "harmlessly punches the"
|
||||
harm_intent_damage = 0
|
||||
melee_damage_lower = 30
|
||||
melee_damage_upper = 30
|
||||
attacktext = "smashes their armoured gauntlet into"
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 4000
|
||||
min_oxy = 0
|
||||
max_co2 = 0
|
||||
max_tox = 0
|
||||
speed = 3
|
||||
wall_smash = 1
|
||||
nopush = 1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
canstun = 0
|
||||
canweaken = 0
|
||||
|
||||
|
||||
Life()
|
||||
..()
|
||||
if(stat == 2)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap ")
|
||||
ghostize(0)
|
||||
del src
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/constructarmoured/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
if(O.force >= 11)
|
||||
health -= O.force
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
|
||||
else
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructarmoured/Bump(atom/movable/AM as mob|obj, yes)
|
||||
|
||||
spawn( 0 )
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(prob(5))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if(tmob.nopush)
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!( istype(AM, /atom/movable) ))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
return
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructarmoured/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/constructbuilder))
|
||||
health += 10
|
||||
M.emote("mends some of \the <EM>[src]'s</EM> wounds")
|
||||
else
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.emote("[M.friendly] \the <EM>[src]</EM>")
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("<span class='attack'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", 1)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
health -= damage
|
||||
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructarmoured/examine()
|
||||
set src in oview()
|
||||
|
||||
var/msg = "<span cass='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
|
||||
if (src.health < src.maxHealth)
|
||||
msg += "<span class='warning'>"
|
||||
if (src.health >= src.maxHealth/2)
|
||||
msg += "It looks slightly dented.\n"
|
||||
else
|
||||
msg += "<B>It looks severely dented!</B>\n"
|
||||
msg += "</span>"
|
||||
msg += "*---------*</span>"
|
||||
|
||||
usr << msg
|
||||
return
|
||||
|
||||
////////////////////////Wraith/////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructwraith
|
||||
name = "Wraith"
|
||||
desc = "A wicked bladed shell contraption piloted by a bound spirit"
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "floating"
|
||||
icon_living = "floating"
|
||||
icon_dead = "shade_dead"
|
||||
maxHealth = 75
|
||||
health = 75
|
||||
speak_emote = list("hisses")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "punches the"
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 25
|
||||
attacktext = "slashes"
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 4000
|
||||
min_oxy = 0
|
||||
max_co2 = 0
|
||||
max_tox = 0
|
||||
speed = -1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
canstun = 0
|
||||
canweaken = 0
|
||||
see_in_dark = 7
|
||||
|
||||
Life()
|
||||
..()
|
||||
if(stat == 2)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap ")
|
||||
ghostize(0)
|
||||
del src
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructwraith/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
if(O.force)
|
||||
health -= O.force
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
|
||||
else
|
||||
usr << "\red This weapon is ineffective, it does no damage."
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red [user] gently taps [src] with the [O]. ")
|
||||
|
||||
/mob/living/simple_animal/constructwraith/Bump(atom/movable/AM as mob|obj, yes)
|
||||
|
||||
spawn( 0 )
|
||||
if ((!( yes ) || now_pushing))
|
||||
return
|
||||
now_pushing = 1
|
||||
if(ismob(AM))
|
||||
var/mob/tmob = AM
|
||||
if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT)
|
||||
if(prob(50))
|
||||
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
|
||||
now_pushing = 0
|
||||
return
|
||||
if(tmob.nopush)
|
||||
now_pushing = 0
|
||||
return
|
||||
|
||||
tmob.LAssailant = src
|
||||
now_pushing = 0
|
||||
..()
|
||||
if (!( istype(AM, /atom/movable) ))
|
||||
return
|
||||
if (!( now_pushing ))
|
||||
now_pushing = 1
|
||||
if (!( AM.anchored ))
|
||||
var/t = get_dir(src, AM)
|
||||
if (istype(AM, /obj/structure/window))
|
||||
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
|
||||
for(var/obj/structure/window/win in get_step(AM,t))
|
||||
now_pushing = 0
|
||||
return
|
||||
step(AM, t)
|
||||
now_pushing = null
|
||||
return
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/constructwraith/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/constructbuilder))
|
||||
health += 10
|
||||
M.emote("mends some of \the <EM>[src]'s</EM> wounds")
|
||||
else
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.emote("[M.friendly] \the <EM>[src]</EM>")
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("<span class='attack'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", 1)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
health -= damage
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/constructwraith/examine()
|
||||
set src in oview()
|
||||
|
||||
var/msg = "<span cass='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
|
||||
if (src.health < src.maxHealth)
|
||||
msg += "<span class='warning'>"
|
||||
if (src.health >= src.maxHealth/2)
|
||||
msg += "It looks slightly dented.\n"
|
||||
else
|
||||
msg += "<B>It looks severely dented!</B>\n"
|
||||
msg += "</span>"
|
||||
msg += "*---------*</span>"
|
||||
|
||||
usr << msg
|
||||
return
|
||||
|
||||
|
||||
|
||||
/////////////////////////////Artificer/////////////////////////
|
||||
|
||||
/mob/living/simple_animal/constructbuilder
|
||||
name = "Artificer"
|
||||
desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies"
|
||||
icon = 'mob.dmi'
|
||||
icon_state = "artificer"
|
||||
icon_living = "artificer"
|
||||
icon_dead = "shade_dead"
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
speak_emote = list("hisses")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
response_disarm = "flails at"
|
||||
response_harm = "viciously beats"
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
attacktext = "rams"
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 4000
|
||||
min_oxy = 0
|
||||
max_co2 = 0
|
||||
max_tox = 0
|
||||
speed = 0
|
||||
wall_smash = 1
|
||||
nopush = 1
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
canstun = 0
|
||||
canweaken = 0
|
||||
|
||||
Life()
|
||||
..()
|
||||
if(stat == 2)
|
||||
new /obj/item/weapon/ectoplasm (src.loc)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if((M.client && !( M.blinded )))
|
||||
M.show_message("\red [src] collapses in a shattered heap ")
|
||||
ghostize(0)
|
||||
del src
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/constructbuilder/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(istype(M, /mob/living/simple_animal/constructbuilder))
|
||||
health += 5
|
||||
M.emote("mends some of \the <EM>[src]'s</EM> wounds")
|
||||
else
|
||||
if(M.melee_damage_upper <= 0)
|
||||
M.emote("[M.friendly] \the <EM>[src]</EM>")
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("<span class='attack'>\The <EM>[M]</EM> [M.attacktext] \the <EM>[src]</EM>!</span>", 1)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
health -= damage
|
||||
|
||||
/mob/living/simple_animal/constructbuilder/examine()
|
||||
set src in oview()
|
||||
|
||||
var/msg = "<span cass='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n"
|
||||
if (src.health < src.maxHealth)
|
||||
msg += "<span class='warning'>"
|
||||
if (src.health >= src.maxHealth/2)
|
||||
msg += "It looks slightly dented.\n"
|
||||
else
|
||||
msg += "<B>It looks severely dented!</B>\n"
|
||||
msg += "</span>"
|
||||
msg += "*---------*</span>"
|
||||
|
||||
usr << msg
|
||||
return
|
||||
@@ -112,9 +112,9 @@
|
||||
comm.ai += O
|
||||
|
||||
O << "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>"
|
||||
O << "<B>To look at other parts of the station, double-click yourself to get a camera menu.</B>"
|
||||
O << "<B>To look at other parts of the station, double-click yourself to get a camera menu, use the freelook command, or use the Show Camera List command..</B>"
|
||||
O << "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>"
|
||||
O << "To use something, simply double-click it."
|
||||
O << "To use something, simply click or double-click it."
|
||||
O << "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI."
|
||||
if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai)))
|
||||
O.show_laws()
|
||||
@@ -123,6 +123,7 @@
|
||||
O << "1.) Act like an AI. If someone is breaking into your upload, say something like \"Alert. Unauthorised Access Detected: AI Upload.\" not \"Help! Urist is trying to subvert me!\""
|
||||
O << "2.) Do not watch the traitor like a hawk alerting the station to his/her every move. This relates to 1."
|
||||
O << "3.) You are theoretically omniscient, but you should not be Beepsky 5000, laying down the law left and right. That is security's job. Instead, try to keep the station productive and effective. (Feel free to report the location of major violence and crimes and all that, just do not be the evil thing looking over peoples shoulders)"
|
||||
O << "4.) Your laws are not in preference, laws do not take preference over one another unless specifically stated in the law."
|
||||
O << "<br>We want everyone to have a good time, so we, the admins, will try to correct you if you stray from these rules. Just try to keep it sensible."
|
||||
|
||||
|
||||
@@ -198,8 +199,8 @@
|
||||
|
||||
O.loc = loc
|
||||
O << "<B>You are playing a Robot. A Robot can interact with most electronic objects in its view point.</B>"
|
||||
O << "<B>You must follow the laws that the AI has. You are the AI's assistant to the station basically.</B>"
|
||||
O << "To use something, simply double-click it."
|
||||
O << "<B>You must follow the laws that the AI has. You are basically the AI's extension into station.</B>"
|
||||
O << "To use something, simply click or double-click it."
|
||||
O << {"Use say ":s to speak to fellow cyborgs and the AI through binary."}
|
||||
|
||||
O.job = "Cyborg"
|
||||
|
||||
@@ -18,6 +18,17 @@
|
||||
#define HUMAN_NEEDED_OXYGEN MOLES_CELLSTANDARD*BREATH_PERCENTAGE*0.16
|
||||
//Amount of air needed before pass out/suffocation commences
|
||||
|
||||
// Pressure limits.
|
||||
#define HAZARD_HIGH_PRESSURE 750
|
||||
#define HIGH_STEP_PRESSURE HAZARD_HIGH_PRESSURE/2
|
||||
#define WARNING_HIGH_PRESSURE HAZARD_HIGH_PRESSURE*0.7
|
||||
#define HAZARD_LOW_PRESSURE 20
|
||||
#define WARNING_LOW_PRESSURE HAZARD_LOW_PRESSURE*2.5
|
||||
#define MAX_PRESSURE_DAMAGE 20
|
||||
|
||||
// Doors!
|
||||
#define DOOR_CRUSH_DAMAGE 10
|
||||
|
||||
// Factor of how fast mob nutrition decreases
|
||||
#define HUNGER_FACTOR 0.1
|
||||
#define REAGENTS_METABOLISM 0.05
|
||||
@@ -72,7 +83,10 @@
|
||||
#define TANK_FRAGMENT_PRESSURE (50.*ONE_ATMOSPHERE) // Boom 3x3 base explosion
|
||||
#define TANK_FRAGMENT_SCALE (10.*ONE_ATMOSPHERE) // +1 for each SCALE kPa aboe threshold
|
||||
// was 2 atm
|
||||
#define MAX_EXPLOSION_RANGE 14 // Defaults to 12 (was 8) -- TLE
|
||||
|
||||
//This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage
|
||||
var/MAX_EXPLOSION_RANGE = 14
|
||||
//#define MAX_EXPLOSION_RANGE 14 // Defaults to 12 (was 8) -- TLE
|
||||
|
||||
|
||||
#define NORMPIPERATE 30 //pipe-insulation rate divisor
|
||||
@@ -140,6 +154,17 @@
|
||||
//Cant seem to find a mob bitflags area other than the powers one
|
||||
#define NOGRAV 1
|
||||
|
||||
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
|
||||
#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!
|
||||
#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!!
|
||||
#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!!
|
||||
#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!!
|
||||
#define HIDEMASK 1 //APPLIES ONLY TO HELMETS!!
|
||||
#define HIDEEARS 2 //APPLIES ONLY TO HELMETS!!
|
||||
#define HIDEEYES 4 //APPLIES ONLY TO HELMETS!!
|
||||
|
||||
|
||||
//Cant seem to find a mob bitflags area other than the powers one
|
||||
|
||||
// bitflags for clothing parts
|
||||
#define HEAD 1
|
||||
@@ -183,6 +208,7 @@ var/const
|
||||
mFingerprints =(1<<1)
|
||||
mShock =(1<<2)
|
||||
mSmallsize =(1<<3)
|
||||
NOCLONE =(1<<4)
|
||||
|
||||
//mob/var/stat things
|
||||
var/const
|
||||
@@ -203,6 +229,13 @@ var/const
|
||||
#define MAINT 8 // under maintaince
|
||||
#define EMPED 16 // temporary broken by EMP pulse
|
||||
|
||||
//bitflags for door switches.
|
||||
#define OPEN 1
|
||||
#define IDSCAN 2
|
||||
#define BOLTS 4
|
||||
#define SHOCK 8
|
||||
#define SAFE 16
|
||||
|
||||
#define ENGINE_EJECT_Z 3
|
||||
|
||||
//metal, glass, rod stacks
|
||||
@@ -238,6 +271,7 @@ var/list/global_mutations = list() // list of hidden mutation things
|
||||
#define TOX "tox"
|
||||
#define OXY "oxy"
|
||||
#define CLONE "clone"
|
||||
#define HALLOSS "halloss"
|
||||
|
||||
#define STUN "stun"
|
||||
#define WEAKEN "weaken"
|
||||
@@ -254,4 +288,4 @@ var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','h
|
||||
#define SEC_LEVEL_GREEN 0
|
||||
#define SEC_LEVEL_BLUE 1
|
||||
#define SEC_LEVEL_RED 2
|
||||
#define SEC_LEVEL_DELTA 3
|
||||
#define SEC_LEVEL_DELTA 3
|
||||
|
||||
Reference in New Issue
Block a user