Merged in Erthilo's stuff.

This commit is contained in:
SkyMarshal
2012-03-29 21:11:17 -07:00
71 changed files with 9980 additions and 7140 deletions

View File

@@ -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
..()

View File

@@ -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

View File

@@ -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"

View File

@@ -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"*/

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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()
..()

View File

@@ -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

View 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&apos;ve been stung, until they try to speak and can&apos;t." // Man, fuck javascript. &apos; == '
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&apos;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()

View File

@@ -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

View File

@@ -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()
//
// ..()

View File

@@ -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)

View File

@@ -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>"

View File

@@ -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"

View File

@@ -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

View File

@@ -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
//////////////////////////////////////

View File

@@ -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

View File

@@ -7,6 +7,7 @@
config_tag = "wizard"
required_players = 0
required_enemies = 1
recommended_enemies = 1
uplink_welcome = "Wizardly Uplink Console:"
uplink_uses = 10

View File

@@ -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"

View File

@@ -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"))

View File

@@ -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

View File

@@ -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

View File

@@ -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>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; 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>&rarr; To [P]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; 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]&deg;C ([C.bodytemperature*1.8-459.67]&deg;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()
..()

View 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()

View File

@@ -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

View File

@@ -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++)

View File

@@ -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( )

View File

@@ -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"

View File

@@ -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), \

View File

@@ -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

View File

@@ -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()
..()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -46,7 +46,7 @@
proc/UpdateDamage()
health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + cloneloss)
health = 60 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
return

View File

@@ -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)

View File

@@ -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>"

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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())
*/

View File

@@ -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

View File

@@ -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

View File

@@ -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
..()

View File

@@ -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)

View 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

View File

@@ -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

View File

@@ -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)

View 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

View File

@@ -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"

View File

@@ -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