Merge branch 'master' into upstream-merge-29105
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+12
-6
@@ -7,7 +7,7 @@
|
||||
icon = 'icons/turf/areas.dmi'
|
||||
icon_state = "unknown"
|
||||
layer = AREA_LAYER
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
|
||||
var/map_name // Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
|
||||
@@ -58,7 +58,7 @@
|
||||
'sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg',\
|
||||
'sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg',\
|
||||
'sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
|
||||
flags = CAN_BE_DIRTY
|
||||
flags_1 = CAN_BE_DIRTY_1
|
||||
|
||||
var/list/firedoors
|
||||
var/firedoors_last_closed_on = 0
|
||||
@@ -242,7 +242,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
for(var/area/RA in related)
|
||||
if (RA.fire)
|
||||
RA.fire = 0
|
||||
RA.mouse_opacity = 0
|
||||
RA.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
RA.updateicon()
|
||||
RA.ModifyFiredoors(TRUE)
|
||||
for(var/obj/machinery/firealarm/F in RA)
|
||||
@@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
/area/proc/set_fire_alarm_effect()
|
||||
fire = 1
|
||||
updateicon()
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/area/proc/readyalert()
|
||||
if(name == "Space")
|
||||
@@ -313,12 +313,12 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
if (!( src.party ))
|
||||
src.party = 1
|
||||
src.updateicon()
|
||||
src.mouse_opacity = 0
|
||||
src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
|
||||
/area/proc/partyreset()
|
||||
if (src.party)
|
||||
src.party = 0
|
||||
src.mouse_opacity = 0
|
||||
src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
src.updateicon()
|
||||
for(var/obj/machinery/door/firedoor/D in src)
|
||||
if(!D.welded)
|
||||
@@ -477,3 +477,9 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
valid_territory = FALSE
|
||||
blob_allowed = FALSE
|
||||
addSorted()
|
||||
|
||||
/area/AllowDrop()
|
||||
CRASH("Bad op: area/AllowDrop() called")
|
||||
|
||||
/area/drop_location()
|
||||
CRASH("Bad op: area/drop_location() called")
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/area/areas.dm b/code/game/area/areas.dm (rejected hunks)
|
||||
@@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
// Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
|
||||
if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE)
|
||||
L.client.ambience_playing = 1
|
||||
- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)
|
||||
+ SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ))
|
||||
|
||||
if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE)))
|
||||
return //General ambience check is below the ship ambience so one can play without the other
|
||||
@@ -9,7 +9,7 @@
|
||||
has_gravity = TRUE
|
||||
noteleport = TRUE
|
||||
blob_allowed = FALSE //Should go without saying, no blobs should take over centcom as a win condition.
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/centcom/control
|
||||
name = "CentCom Docks"
|
||||
@@ -37,7 +37,7 @@
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/tdome/arena
|
||||
name = "Thunderdome Arena"
|
||||
@@ -76,7 +76,7 @@
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
noteleport = TRUE
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
//Abductors
|
||||
/area/abductor_ship
|
||||
@@ -85,7 +85,7 @@
|
||||
requires_power = FALSE
|
||||
noteleport = TRUE
|
||||
has_gravity = TRUE
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
//Syndicates
|
||||
/area/syndicate_mothership
|
||||
@@ -95,7 +95,7 @@
|
||||
has_gravity = TRUE
|
||||
noteleport = TRUE
|
||||
blob_allowed = FALSE //Not... entirely sure this will ever come up... but if the bus makes blobs AND ops, it shouldn't aim for the ops to win.
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/syndicate_mothership/control
|
||||
name = "Syndicate Control Room"
|
||||
@@ -115,7 +115,7 @@
|
||||
icon_state = "yellow"
|
||||
requires_power = FALSE
|
||||
has_gravity = TRUE
|
||||
flags = NO_DEATHRATTLE
|
||||
flags_1 = NO_DEATHRATTLE_1
|
||||
|
||||
/area/ctf/control_room
|
||||
name = "Control Room A"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Holodeck"
|
||||
icon_state = "Holodeck"
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
flags = 0
|
||||
flags_1 = 0
|
||||
hidden = TRUE
|
||||
|
||||
var/obj/machinery/computer/holodeck/linked
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
power_light = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = list('sound/ambience/ambimine.ogg')
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/mine/unexplored
|
||||
name = "Mine"
|
||||
@@ -30,7 +30,7 @@
|
||||
power_light = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = list('sound/ambience/ambimine.ogg')
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/mine/lobby
|
||||
name = "Mining Station"
|
||||
@@ -86,7 +86,7 @@
|
||||
/area/lavaland
|
||||
icon_state = "mining"
|
||||
has_gravity = TRUE
|
||||
flags = NONE
|
||||
flags_1 = NONE
|
||||
|
||||
/area/lavaland/surface
|
||||
name = "Lavaland"
|
||||
|
||||
@@ -22,22 +22,6 @@
|
||||
|
||||
//Misc
|
||||
|
||||
/area/wreck/ai
|
||||
name = "AI Chamber"
|
||||
icon_state = "ai"
|
||||
|
||||
/area/wreck/main
|
||||
name = "Wreck"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/wreck/engineering
|
||||
name = "Power Room"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/wreck/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
|
||||
/area/generic
|
||||
name = "Unknown"
|
||||
icon_state = "storage"
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
//Parent types
|
||||
|
||||
/area/ruin
|
||||
name = "\improper Unexplored Location"
|
||||
icon_state = "away"
|
||||
has_gravity = TRUE
|
||||
hidden = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
|
||||
|
||||
/area/ruin/unpowered
|
||||
always_unpowered = FALSE
|
||||
|
||||
/area/ruin/unpowered/no_grav
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/powered
|
||||
requires_power = FALSE
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//Lavaland Ruins
|
||||
|
||||
/area/ruin/powered/beach
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/clownplanet
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/animal_hospital
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/snow_biodome
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/gluttony
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/golem_ship
|
||||
name = "Free Golem Ship"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/greed
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/unpowered/hierophant
|
||||
name = "Hierophant's Arena"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/pride
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/seedvault
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
/area/ruin/powered/syndicate_lava_base
|
||||
name = "Secret Base"
|
||||
icon_state = "dk_yellow"
|
||||
|
||||
//Xeno Nest
|
||||
|
||||
/area/ruin/unpowered/xenonest
|
||||
name = "The Hive"
|
||||
always_unpowered = TRUE
|
||||
power_environ = FALSE
|
||||
power_equip = FALSE
|
||||
power_light = FALSE
|
||||
poweralm = FALSE
|
||||
|
||||
//ash walker nest
|
||||
/area/ruin/unpowered/ash_walkers
|
||||
icon_state = "red"
|
||||
@@ -0,0 +1,429 @@
|
||||
//Space Ruin Parents
|
||||
|
||||
/area/ruin/space
|
||||
has_gravity = FALSE
|
||||
blob_allowed = FALSE //Nope, no winning in space as a blob. Gotta eat the station.
|
||||
|
||||
/area/ruin/space/has_grav
|
||||
has_gravity = TRUE
|
||||
|
||||
/area/ruin/space/has_grav/powered
|
||||
requires_power = FALSE
|
||||
|
||||
|
||||
/area/ruin/fakespace
|
||||
icon_state = "space"
|
||||
requires_power = TRUE
|
||||
always_unpowered = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
has_gravity = FALSE
|
||||
power_light = FALSE
|
||||
power_equip = FALSE
|
||||
power_environ = FALSE
|
||||
valid_territory = FALSE
|
||||
outdoors = TRUE
|
||||
ambientsounds = list('sound/ambience/ambispace.ogg','sound/ambience/title2.ogg')
|
||||
blob_allowed = FALSE
|
||||
|
||||
/////////////
|
||||
|
||||
/area/ruin/space/way_home
|
||||
name = "\improper Salvation"
|
||||
icon_state = "away"
|
||||
always_unpowered = FALSE
|
||||
|
||||
// Ruins of "onehalf" ship
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/hallway
|
||||
name = "Hallway"
|
||||
icon_state = "hallC"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/drone_bay
|
||||
name = "Mining Drone Bay"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/dorms_med
|
||||
name = "Crew Quarters"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/ruin/space/has_grav/onehalf/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
|
||||
|
||||
|
||||
/area/ruin/space/has_grav/powered/dinner_for_two
|
||||
name = "Dinner for Two"
|
||||
|
||||
/area/ruin/space/has_grav/powered/authorship
|
||||
name = "Authorship"
|
||||
|
||||
/area/ruin/space/has_grav/powered/aesthetic
|
||||
name = "Aesthetic"
|
||||
ambientsounds = list('sound/ambience/ambivapor1.ogg')
|
||||
|
||||
|
||||
//Ruin of Hotel
|
||||
|
||||
/area/ruin/space/has_grav/hotel
|
||||
name = "Hotel"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/guestroom
|
||||
name = "Hotel Guest Room"
|
||||
icon_state = "Sleep"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/security
|
||||
name = "Hotel Security Post"
|
||||
icon_state = "security"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/pool
|
||||
name = "Hotel Pool Room"
|
||||
icon_state = "fitness"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/bar
|
||||
name = "Hotel Bar"
|
||||
icon_state = "cafeteria"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/power
|
||||
name = "Hotel Power Room"
|
||||
icon_state = "engine_smes"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/custodial
|
||||
name = "Hotel Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/shuttle
|
||||
name = "Hotel Shuttle"
|
||||
icon_state = "shuttle"
|
||||
requires_power = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/hotel/dock
|
||||
name = "Hotel Shuttle Dock"
|
||||
icon_state = "start"
|
||||
|
||||
/area/ruin/space/has_grav/hotel/workroom
|
||||
name = "Hotel Staff Room"
|
||||
icon_state = "crew_quarters"
|
||||
|
||||
|
||||
|
||||
|
||||
//Ruin of Derelict Oupost
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost
|
||||
name = "Derelict Outpost"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargostorage
|
||||
name = "Derelict Outpost Cargo Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/cargobay
|
||||
name = "Derelict Outpost Cargo Bay"
|
||||
icon_state = "quartstorage"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/powerstorage
|
||||
name = "Derelict Outpost Power Storage"
|
||||
icon_state = "engine_smes"
|
||||
|
||||
/area/ruin/space/has_grav/derelictoutpost/dockedship
|
||||
name = "Derelict Outpost Docked Ship"
|
||||
icon_state = "red"
|
||||
|
||||
|
||||
//Ruin of Space Bar
|
||||
|
||||
/area/ruin/space/has_grav/powered/spacebar
|
||||
name = "Space Bar"
|
||||
icon_state = "bar"
|
||||
|
||||
//Ruin of turretedoutpost
|
||||
|
||||
/area/ruin/space/has_grav/turretedoutpost
|
||||
name = "Turreted Outpost"
|
||||
icon_state = "red"
|
||||
|
||||
|
||||
//Ruin of old teleporter
|
||||
|
||||
/area/ruin/space/oldteleporter
|
||||
name = "Old teleporter"
|
||||
icon_state = "teleporter"
|
||||
|
||||
|
||||
//Ruin of mech transport
|
||||
|
||||
/area/ruin/space/has_grav/powered/mechtransport
|
||||
name = "Mech Transport"
|
||||
icon_state = "green"
|
||||
|
||||
|
||||
//Ruin of gas the lizard
|
||||
|
||||
/area/ruin/space/has_grav/gasthelizard
|
||||
name = "Gas the lizard"
|
||||
|
||||
|
||||
//Ruin of Deep Storage
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage
|
||||
name = "Deep Storage"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/airlock
|
||||
name = "Deep Storage Airlock"
|
||||
icon_state = "quart"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/power
|
||||
name = "Deep Storage Power and Atmospherics Room"
|
||||
icon_state = "engi_storage"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/hydroponics
|
||||
name = "Deep Storage Hydroponics"
|
||||
icon_state = "garden"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/armory
|
||||
name = "Deep Storage Secure Storage"
|
||||
icon_state = "armory"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/storage
|
||||
name = "Deep Storage Storage"
|
||||
icon_state = "storage_wing"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/dorm
|
||||
name = "Deep Storage Dormory"
|
||||
icon_state = "crew_quarters"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/kitchen
|
||||
name = "Deep Storage Kitchen"
|
||||
icon_state = "kitchen"
|
||||
|
||||
/area/ruin/space/has_grav/deepstorage/crusher
|
||||
name = "Deep Storage Recycler"
|
||||
icon_state = "storage"
|
||||
|
||||
|
||||
//Ruin of Abandoned Zoo
|
||||
|
||||
/area/ruin/space/has_grav/abandonedzoo
|
||||
name = "Abandoned Zoo"
|
||||
icon_state = "green"
|
||||
|
||||
|
||||
//Ruin of ancient Space Station
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation
|
||||
name = "Charlie Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/powered
|
||||
name = "Powered Tile"
|
||||
icon_state = "teleporter"
|
||||
requires_power = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/space
|
||||
name = "Exposed To Space"
|
||||
icon_state = "teleporter"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/atmo
|
||||
name = "Beta Station Atmospherics"
|
||||
icon_state = "red"
|
||||
has_gravity = FALSE
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/betanorth
|
||||
name = "Beta Station North Corridor"
|
||||
icon_state = "blue"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/solar
|
||||
name = "Station Solar Array"
|
||||
icon_state = "panelsAP"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/engi
|
||||
name = "Charlie Station Engineering"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/comm
|
||||
name = "Charlie Station Command"
|
||||
icon_state = "captain"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/hydroponics
|
||||
name = "Charlie Station Hydroponics"
|
||||
icon_state = "garden"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/kitchen
|
||||
name = "Charlie Station Kitchen"
|
||||
icon_state = "kitchen"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/sec
|
||||
name = "Charlie Station Security"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/deltacorridor
|
||||
name = "Delta Station Main Corridor"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/proto
|
||||
name = "Delta Station Prototype Lab"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/rnd
|
||||
name = "Delta Station Research and Development"
|
||||
icon_state = "toxlab"
|
||||
|
||||
/area/ruin/space/has_grav/ancientstation/hivebot
|
||||
name = "Hivebot Mothership"
|
||||
icon_state = "teleporter"
|
||||
|
||||
//DERELICT
|
||||
|
||||
/area/ruin/space/derelict
|
||||
name = "Derelict Station"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/derelict/hallway/primary
|
||||
name = "Derelict Primary Hallway"
|
||||
icon_state = "hallP"
|
||||
|
||||
/area/ruin/space/derelict/hallway/secondary
|
||||
name = "Derelict Secondary Hallway"
|
||||
icon_state = "hallS"
|
||||
|
||||
/area/ruin/space/derelict/hallway/primary/port
|
||||
name = "Derelict Port Hallway"
|
||||
icon_state = "hallFP"
|
||||
|
||||
/area/ruin/space/derelict/arrival
|
||||
name = "Derelict Arrival Centre"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/ruin/space/derelict/storage/equipment
|
||||
name = "Derelict Equipment Storage"
|
||||
|
||||
/area/ruin/space/derelict/storage/storage_access
|
||||
name = "Derelict Storage Access"
|
||||
|
||||
/area/ruin/space/derelict/storage/engine_storage
|
||||
name = "Derelict Engine Storage"
|
||||
icon_state = "green"
|
||||
|
||||
/area/ruin/space/derelict/bridge
|
||||
name = "Derelict Control Room"
|
||||
icon_state = "bridge"
|
||||
|
||||
/area/ruin/space/derelict/secret
|
||||
name = "Derelict Secret Room"
|
||||
icon_state = "library"
|
||||
|
||||
/area/ruin/space/derelict/bridge/access
|
||||
name = "Derelict Control Room Access"
|
||||
icon_state = "auxstorage"
|
||||
|
||||
/area/ruin/space/derelict/bridge/ai_upload
|
||||
name = "Derelict Computer Core"
|
||||
icon_state = "ai"
|
||||
|
||||
/area/ruin/space/derelict/solar_control
|
||||
name = "Derelict Solar Control"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/se_solar
|
||||
name = "South East Solars"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/crew_quarters
|
||||
name = "Derelict Crew Quarters"
|
||||
icon_state = "fitness"
|
||||
|
||||
/area/ruin/space/derelict/medical
|
||||
name = "Derelict Medbay"
|
||||
icon_state = "medbay"
|
||||
|
||||
/area/ruin/space/derelict/medical/morgue
|
||||
name = "Derelict Morgue"
|
||||
icon_state = "morgue"
|
||||
|
||||
/area/ruin/space/derelict/medical/chapel
|
||||
name = "Derelict Chapel"
|
||||
icon_state = "chapel"
|
||||
|
||||
/area/ruin/space/derelict/teleporter
|
||||
name = "Derelict Teleporter"
|
||||
icon_state = "teleporter"
|
||||
|
||||
/area/ruin/space/derelict/eva
|
||||
name = "Derelict EVA Storage"
|
||||
icon_state = "eva"
|
||||
|
||||
/area/ruin/space/derelict/ship
|
||||
name = "Abandoned Ship"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/solar/derelict_starboard
|
||||
name = "Derelict Starboard Solar Array"
|
||||
icon_state = "panelsS"
|
||||
|
||||
/area/solar/derelict_aft
|
||||
name = "Derelict Aft Solar Array"
|
||||
icon_state = "yellow"
|
||||
|
||||
/area/ruin/space/derelict/singularity_engine
|
||||
name = "Derelict Singularity Engine"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/derelict/gravity_generator
|
||||
name = "Derelict Gravity Generator Room"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/derelict/atmospherics
|
||||
name = "Derelict Atmospherics"
|
||||
icon_state = "red"
|
||||
|
||||
/area/ruin/space/derelict/assembly_line
|
||||
name = "Assembly Line"
|
||||
icon_state = "ass_line"
|
||||
power_equip = FALSE
|
||||
power_light = FALSE
|
||||
power_environ = FALSE
|
||||
|
||||
|
||||
//DJSTATION
|
||||
|
||||
/area/ruin/space/djstation
|
||||
name = "Ruskie DJ Station"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
blob_allowed = FALSE //Nope, no winning on the DJ station as a blob. Gotta eat the main station.
|
||||
|
||||
/area/ruin/space/djstation/solars
|
||||
name = "DJ Station Solars"
|
||||
icon_state = "DJ"
|
||||
has_gravity = TRUE
|
||||
|
||||
|
||||
//ABANDONED TELEPORTER
|
||||
|
||||
/area/ruin/space/abandoned_tele
|
||||
name = "Abandoned Teleporter"
|
||||
icon_state = "teleporter"
|
||||
music = "signal"
|
||||
ambientsounds = list('sound/ambience/ambimalf.ogg')
|
||||
|
||||
//OLD AI SAT
|
||||
|
||||
/area/ruin/space/old_ai_sat/ai
|
||||
name = "AI Chamber"
|
||||
icon_state = "ai"
|
||||
ambientsounds = list('sound/ambience/ambimalf.ogg')
|
||||
|
||||
/area/ruin/space/old_ai_sat/main
|
||||
name = "Wreck"
|
||||
icon_state = "storage"
|
||||
|
||||
/area/ruin/space/old_ai_sat/engineering
|
||||
name = "Power Room"
|
||||
icon_state = "engine"
|
||||
|
||||
/area/ruin/space/old_ai_sat/bridge
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
+27
-15
@@ -3,13 +3,13 @@
|
||||
plane = GAME_PLANE
|
||||
var/level = 2
|
||||
|
||||
var/flags = 0
|
||||
var/list/secondary_flags
|
||||
var/flags_1 = 0
|
||||
var/flags_2 = 0
|
||||
|
||||
var/list/fingerprints
|
||||
var/list/fingerprintshidden
|
||||
var/list/blood_DNA
|
||||
var/container_type = 0
|
||||
var/container_type = NONE
|
||||
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
|
||||
var/datum/reagents/reagents = null
|
||||
|
||||
@@ -193,26 +193,26 @@
|
||||
// returns true if open
|
||||
// false if closed
|
||||
/atom/proc/is_open_container()
|
||||
return container_type & OPENCONTAINER
|
||||
return container_type & OPENCONTAINER_1
|
||||
|
||||
/atom/proc/is_transparent()
|
||||
return container_type & TRANSPARENT
|
||||
return container_type & TRANSPARENT_1
|
||||
|
||||
/atom/proc/is_injectable(allowmobs = TRUE)
|
||||
if(isliving(src) && allowmobs)
|
||||
var/mob/living/L = src
|
||||
return L.can_inject()
|
||||
if(container_type & OPENCONTAINER)
|
||||
if(container_type & OPENCONTAINER_1)
|
||||
return TRUE
|
||||
return container_type & INJECTABLE
|
||||
return container_type & INJECTABLE_1
|
||||
|
||||
/atom/proc/is_drawable(allowmobs = TRUE)
|
||||
if(is_injectable(allowmobs)) //Everything that can be injected can also be drawn from, but not vice versa
|
||||
return TRUE
|
||||
return container_type & DRAWABLE
|
||||
return container_type & DRAWABLE_1
|
||||
|
||||
/atom/proc/allow_drop()
|
||||
return 1
|
||||
/atom/proc/AllowDrop()
|
||||
return FALSE
|
||||
|
||||
/atom/proc/CheckExit()
|
||||
return 1
|
||||
@@ -221,7 +221,7 @@
|
||||
return
|
||||
|
||||
/atom/proc/emp_act(severity)
|
||||
if(istype(wires) && !HAS_SECONDARY_FLAG(src, NO_EMP_WIRES))
|
||||
if(istype(wires) && !(flags_2 & NO_EMP_WIRES_2))
|
||||
wires.emp_pulse()
|
||||
|
||||
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
|
||||
@@ -479,14 +479,17 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
/atom/proc/ratvar_act()
|
||||
return
|
||||
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/weapon/construction/rcd/the_rcd)
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/rcd_act(mob/user, obj/item/weapon/construction/rcd/the_rcd, passed_mode)
|
||||
/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
|
||||
return FALSE
|
||||
|
||||
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
|
||||
return 0
|
||||
/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user)
|
||||
return 0
|
||||
|
||||
/atom/proc/get_dumping_location(obj/item/storage/source,mob/user)
|
||||
return null
|
||||
|
||||
//This proc is called on the location of an atom when the atom is Destroy()'d
|
||||
/atom/proc/handle_atom_del(atom/A)
|
||||
@@ -610,3 +613,12 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
.["Add reagent"] = "?_src_=vars;addreagent=\ref[src]"
|
||||
.["Trigger EM pulse"] = "?_src_=vars;emp=\ref[src]"
|
||||
.["Trigger explosion"] = "?_src_=vars;explode=\ref[src]"
|
||||
|
||||
/atom/proc/drop_location()
|
||||
var/atom/L = loc
|
||||
if(!L)
|
||||
return null
|
||||
return L.AllowDrop() ? L : get_turf(L)
|
||||
|
||||
/atom/Entered(atom/movable/AM, atom/oldLoc)
|
||||
SendSignal(COMSIG_ATOM_ENTERED, AM, oldLoc)
|
||||
|
||||
+14
-21
@@ -1,11 +1,4 @@
|
||||
|
||||
#ifndef PIXEL_SCALE
|
||||
#define PIXEL_SCALE 0
|
||||
#if DM_VERSION >= 512
|
||||
#error HEY, PIXEL_SCALE probably exists now, remove this gross ass shim.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/atom/movable
|
||||
layer = OBJ_LAYER
|
||||
var/last_move = null
|
||||
@@ -137,7 +130,7 @@
|
||||
if (orbiting)
|
||||
orbiting.Check()
|
||||
|
||||
if(flags & CLEAN_ON_MOVE)
|
||||
if(flags_1 & CLEAN_ON_MOVE_1)
|
||||
clean_on_move()
|
||||
|
||||
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
|
||||
@@ -176,8 +169,8 @@
|
||||
to_chat(cleaned_human, "<span class='danger'>[src] cleans your face!</span>")
|
||||
|
||||
/atom/movable/Destroy(force)
|
||||
var/inform_admins = HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
|
||||
var/stationloving = HAS_SECONDARY_FLAG(src, STATIONLOVING)
|
||||
var/inform_admins = (flags_2 & INFORM_ADMINS_ON_RELOCATE_2)
|
||||
var/stationloving = (flags_2 & STATIONLOVING_2)
|
||||
|
||||
if(inform_admins && force)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -215,13 +208,13 @@
|
||||
// This is automatically called when something enters your square
|
||||
//oldloc = old location on atom, inserted when forceMove is called and ONLY when forceMove is called!
|
||||
/atom/movable/Crossed(atom/movable/AM, oldloc)
|
||||
return
|
||||
SendSignal(COMSIG_MOVABLE_CROSSED, AM)
|
||||
|
||||
|
||||
//This is tg's equivalent to the byond bump, it used to be called bump with a second arg
|
||||
//to differentiate it, naturally everyone forgot about this immediately and so some things
|
||||
//would bump twice, so now it's called Collide
|
||||
/atom/movable/proc/Collide(atom/A)
|
||||
/atom/movable/proc/Collide(atom/A)
|
||||
if((A))
|
||||
if(throwing)
|
||||
throwing.hit_atom(A)
|
||||
@@ -323,7 +316,7 @@
|
||||
..()
|
||||
|
||||
/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback)
|
||||
if (!target || (flags & NODROP) || speed <= 0)
|
||||
if (!target || (flags_1 & NODROP_1) || speed <= 0)
|
||||
return
|
||||
|
||||
if (pulledby)
|
||||
@@ -550,21 +543,21 @@
|
||||
*/
|
||||
|
||||
/atom/movable/proc/set_stationloving(state, inform_admins=FALSE)
|
||||
var/currently = HAS_SECONDARY_FLAG(src, STATIONLOVING)
|
||||
var/currently = (flags_2 & STATIONLOVING_2)
|
||||
|
||||
if(inform_admins)
|
||||
SET_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
|
||||
flags_2 |= INFORM_ADMINS_ON_RELOCATE_2
|
||||
else
|
||||
CLEAR_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE)
|
||||
flags_2 &= ~INFORM_ADMINS_ON_RELOCATE_2
|
||||
|
||||
if(state == currently)
|
||||
return
|
||||
else if(!state)
|
||||
STOP_PROCESSING(SSinbounds, src)
|
||||
CLEAR_SECONDARY_FLAG(src, STATIONLOVING)
|
||||
flags_2 &= ~STATIONLOVING_2
|
||||
else
|
||||
START_PROCESSING(SSinbounds, src)
|
||||
SET_SECONDARY_FLAG(src, STATIONLOVING)
|
||||
flags_2 |= STATIONLOVING_2
|
||||
|
||||
/atom/movable/proc/relocate()
|
||||
var/targetturf = find_safe_turf(ZLEVEL_STATION)
|
||||
@@ -577,8 +570,8 @@
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.transferItemToLoc(src, targetturf, TRUE) //nodrops disks when?
|
||||
else if(istype(loc, /obj/item/weapon/storage))
|
||||
var/obj/item/weapon/storage/S = loc
|
||||
else if(istype(loc, /obj/item/storage))
|
||||
var/obj/item/storage/S = loc
|
||||
S.remove_from_storage(src, targetturf)
|
||||
else
|
||||
forceMove(targetturf)
|
||||
@@ -593,7 +586,7 @@
|
||||
to_chat(get(src, /mob), "<span class='danger'>You can't help but feel that you just lost something back there...</span>")
|
||||
var/turf/targetturf = relocate()
|
||||
log_game("[src] has been moved out of bounds in [COORD(currentturf)]. Moving it to [COORD(targetturf)].")
|
||||
if(HAS_SECONDARY_FLAG(src, INFORM_ADMINS_ON_RELOCATE))
|
||||
if(flags_2 & INFORM_ADMINS_ON_RELOCATE_2)
|
||||
message_admins("[src] has been moved out of bounds in [ADMIN_COORDJMP(currentturf)]. Moving it to [ADMIN_COORDJMP(targetturf)].")
|
||||
|
||||
/atom/movable/proc/in_bounds()
|
||||
|
||||
@@ -202,18 +202,18 @@
|
||||
for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD))
|
||||
holder = hud_list[i]
|
||||
holder.icon_state = null
|
||||
for(var/obj/item/weapon/implant/I in implants)
|
||||
if(istype(I, /obj/item/weapon/implant/tracking))
|
||||
for(var/obj/item/implant/I in implants)
|
||||
if(istype(I, /obj/item/implant/tracking))
|
||||
holder = hud_list[IMPTRACK_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_tracking"
|
||||
else if(istype(I, /obj/item/weapon/implant/mindshield))
|
||||
else if(istype(I, /obj/item/implant/mindshield))
|
||||
holder = hud_list[IMPLOYAL_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
holder.icon_state = "hud_imp_loyal"
|
||||
else if(istype(I, /obj/item/weapon/implant/chem))
|
||||
else if(istype(I, /obj/item/implant/chem))
|
||||
holder = hud_list[IMPCHEM_HUD]
|
||||
var/icon/IC = icon(icon, icon_state, dir)
|
||||
holder.pixel_y = IC.Height() - world.icon_size
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
/obj/item/weapon/antag_spawner
|
||||
/obj/item/antag_spawner
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/used = 0
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target)
|
||||
/obj/item/antag_spawner/proc/equip_antag(mob/target)
|
||||
return
|
||||
|
||||
|
||||
///////////WIZARD
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract
|
||||
/obj/item/antag_spawner/contract
|
||||
name = "contract"
|
||||
desc = "A magic contract previously signed by an apprentice. In exchange for instruction in the magical arts, they are bound to answer your call for aid."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state ="scroll2"
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/contract/attack_self(mob/user)
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
if(used)
|
||||
@@ -41,7 +41,7 @@
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/Topic(href, href_list)
|
||||
/obj/item/antag_spawner/contract/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
else
|
||||
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, type = "")
|
||||
new /obj/effect/particle_effect/smoke(T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
@@ -90,7 +90,7 @@
|
||||
if("healing")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
|
||||
M.put_in_hands_or_del(new /obj/item/weapon/gun/magic/staff/healing(M))
|
||||
M.put_in_hands_or_del(new /obj/item/gun/magic/staff/healing(M))
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
|
||||
if("robeless")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
@@ -121,26 +121,26 @@
|
||||
M.age = rand(AGE_MIN, WIZARD_AGE_MIN - 1)
|
||||
M.dna.update_dna_identity()
|
||||
|
||||
/obj/item/weapon/antag_spawner/contract/equip_antag(mob/target)
|
||||
/obj/item/antag_spawner/contract/equip_antag(mob/target)
|
||||
target.equip_to_slot_or_del(new /obj/item/device/radio/headset(target), slot_ears)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(target), slot_w_uniform)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(target), slot_shoes)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(target), slot_wear_suit)
|
||||
target.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(target), slot_head)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(target), slot_back)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/storage/box(target), slot_in_backpack)
|
||||
target.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll/apprentice(target), slot_r_store)
|
||||
target.equip_to_slot_or_del(new /obj/item/storage/backpack(target), slot_back)
|
||||
target.equip_to_slot_or_del(new /obj/item/storage/box(target), slot_in_backpack)
|
||||
target.equip_to_slot_or_del(new /obj/item/teleportation_scroll/apprentice(target), slot_r_store)
|
||||
///////////BORGS AND OPERATIVES
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops
|
||||
/obj/item/antag_spawner/nuke_ops
|
||||
name = "syndicate operative teleporter"
|
||||
desc = "A single-use teleporter designed to quickly reinforce operatives in the field."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "locator"
|
||||
var/borg_to_spawn
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/proc/check_usability(mob/user)
|
||||
/obj/item/antag_spawner/nuke_ops/proc/check_usability(mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
|
||||
return FALSE
|
||||
@@ -153,7 +153,7 @@
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
|
||||
if(!(check_usability(user)))
|
||||
return
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
M.key = C.key
|
||||
@@ -185,21 +185,21 @@
|
||||
M.name = newname
|
||||
|
||||
//////SYNDICATE BORG
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele
|
||||
name = "syndicate cyborg teleporter"
|
||||
desc = "A single-use teleporter designed to quickly reinforce operatives in the field.."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "locator"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/assault
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/assault
|
||||
name = "syndicate assault cyborg teleporter"
|
||||
borg_to_spawn = "Assault"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/medical
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/medical
|
||||
name = "syndicate medical teleporter"
|
||||
borg_to_spawn = "Medical"
|
||||
|
||||
/obj/item/weapon/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
|
||||
var/mob/living/silicon/robot/R
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
@@ -225,7 +225,7 @@
|
||||
|
||||
///////////SLAUGHTER DEMON
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon //Warning edgiest item in the game
|
||||
/obj/item/antag_spawner/slaughter_demon //Warning edgiest item in the game
|
||||
name = "vial of blood"
|
||||
desc = "A magically infused bottle of blood, distilled from countless murder victims. Used in unholy rituals to attract horrifying creatures."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -237,7 +237,7 @@
|
||||
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
|
||||
if(user.z != ZLEVEL_STATION)
|
||||
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
|
||||
return
|
||||
@@ -258,7 +258,7 @@
|
||||
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "")
|
||||
|
||||
var /obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
|
||||
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
|
||||
@@ -285,7 +285,7 @@
|
||||
to_chat(S, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
||||
to_chat(S, "<B>Objective #[new_objective ? "[2]":"[1]"]</B>: [new_objective2.explanation_text]")
|
||||
|
||||
/obj/item/weapon/antag_spawner/slaughter_demon/laughter
|
||||
/obj/item/antag_spawner/slaughter_demon/laughter
|
||||
name = "vial of tickles"
|
||||
desc = "A magically infused bottle of clown love, distilled from countless hugging attacks. Used in funny rituals to attract adorable creatures."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
////////////Syndicate Cortical Borer
|
||||
obj/item/weapon/antag_spawner/syndi_borer
|
||||
obj/item/antag_spawner/syndi_borer
|
||||
name = "syndicate brain-slug container"
|
||||
desc = "Releases a modified cortical borer to assist the user."
|
||||
icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work.
|
||||
icon_state = "locator"
|
||||
var/polling = FALSE
|
||||
|
||||
obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
|
||||
obj/item/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner)
|
||||
var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T)
|
||||
|
||||
B.key = C.key
|
||||
@@ -27,7 +27,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
|
||||
if(new_objective)
|
||||
to_chat(B, "<B>Objective #[1]</B>: [new_objective.explanation_text]")
|
||||
SSticker.mode.update_borer_icons_added(B)
|
||||
/obj/item/weapon/antag_spawner/syndi_borer/proc/check_usability(mob/user)
|
||||
/obj/item/antag_spawner/syndi_borer/proc/check_usability(mob/user)
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>[src] appears to be empty!</span>")
|
||||
return 0
|
||||
@@ -36,7 +36,7 @@ obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owne
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/antag_spawner/syndi_borer/attack_self(mob/user)
|
||||
/obj/item/antag_spawner/syndi_borer/attack_self(mob/user)
|
||||
if(!(check_usability(user)))
|
||||
return
|
||||
polling = TRUE
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
desc = "The overmind. It controls the blob."
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "marker"
|
||||
mouse_opacity = 1
|
||||
mouse_opacity = MOUSE_OPACITY_ICON
|
||||
move_on_shuttle = 1
|
||||
see_in_dark = 8
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm (rejected hunks)
|
||||
@@ -175,7 +175,7 @@
|
||||
SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
|
||||
to_chat(blobber, "<b>You are a blobbernaut!</b>")
|
||||
to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.")
|
||||
- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via <b>:b</b>")
|
||||
+ to_chat(blobber, "You can communicate with other blobbernauts and overminds via <b>:b</b>")
|
||||
to_chat(blobber, "Your overmind's blob reagent is: <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font>!")
|
||||
to_chat(blobber, "The <b><font color=\"[blob_reagent_datum.color]\">[blob_reagent_datum.name]</b></font> reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]")
|
||||
if(blobber)
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/proc/check_weapon(mob/user, obj/item/hand_item)
|
||||
if(istype(hand_item, weapon_type))
|
||||
user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item
|
||||
user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL_1 will delete the item
|
||||
if(!silent)
|
||||
playsound(user, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
user.visible_message("<span class='warning'>With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!</span>", "<span class='notice'>We assimilate the [weapon_name_simple] back into our body.</span>", "<span class='italics>You hear organic matter ripping and tearing!</span>")
|
||||
@@ -137,18 +137,18 @@
|
||||
chemical_cost = 20
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/weapon/melee/arm_blade
|
||||
weapon_type = /obj/item/melee/arm_blade
|
||||
weapon_name_simple = "blade"
|
||||
|
||||
/obj/item/weapon/melee/arm_blade
|
||||
/obj/item/melee/arm_blade
|
||||
name = "arm blade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "arm_blade"
|
||||
item_state = "arm_blade"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
flags = ABSTRACT | NODROP | DROPDEL
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
force = 25
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
@@ -159,14 +159,14 @@
|
||||
sharpness = IS_SHARP
|
||||
var/can_drop = FALSE
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/Initialize(mapload,silent,synthetic)
|
||||
/obj/item/melee/arm_blade/Initialize(mapload,silent,synthetic)
|
||||
. = ..()
|
||||
if(ismob(loc) && !silent)
|
||||
loc.visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>", "<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
if(synthetic)
|
||||
can_drop = TRUE
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity)
|
||||
return
|
||||
if(istype(target, /obj/structure/table))
|
||||
@@ -197,10 +197,10 @@
|
||||
"<span class='italics'>You hear a metal screeching sound.</span>")
|
||||
A.open(2)
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
|
||||
/obj/item/melee/arm_blade/dropped(mob/user)
|
||||
..()
|
||||
if(can_drop)
|
||||
new /obj/item/weapon/melee/synthetic_arm_blade(get_turf(user))
|
||||
new /obj/item/melee/synthetic_arm_blade(get_turf(user))
|
||||
|
||||
/***************************************\
|
||||
|***********COMBAT TENTACLES*************|
|
||||
@@ -215,19 +215,19 @@
|
||||
chemical_cost = 10
|
||||
dna_cost = 2
|
||||
req_human = 1
|
||||
weapon_type = /obj/item/weapon/gun/magic/tentacle
|
||||
weapon_type = /obj/item/gun/magic/tentacle
|
||||
weapon_name_simple = "tentacle"
|
||||
silent = TRUE
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle
|
||||
/obj/item/gun/magic/tentacle
|
||||
name = "tentacle"
|
||||
desc = "A fleshy tentacle that can stretch out and grab things or people."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "tentacle"
|
||||
item_state = "tentacle"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
flags = ABSTRACT | NODROP | DROPDEL | NOBLUDGEON
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1 | NOBLUDGEON_1
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
ammo_type = /obj/item/ammo_casing/magic/tentacle
|
||||
fire_sound = 'sound/effects/splat.ogg'
|
||||
@@ -237,7 +237,7 @@
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/Initialize(mapload, silent)
|
||||
/obj/item/gun/magic/tentacle/Initialize(mapload, silent)
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
if(!silent)
|
||||
@@ -246,10 +246,10 @@
|
||||
to_chat(loc, "<span class='notice'>You prepare to extend a tentacle.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
/obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj)
|
||||
to_chat(user, "<span class='warning'>The [name] is not ready yet.<span>")
|
||||
|
||||
/obj/item/weapon/gun/magic/tentacle/suicide_act(mob/user)
|
||||
/obj/item/gun/magic/tentacle/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (OXYLOSS)
|
||||
|
||||
@@ -261,7 +261,7 @@
|
||||
caliber = "tentacle"
|
||||
icon_state = "tentacle_end"
|
||||
firing_effect_type = null
|
||||
var/obj/item/weapon/gun/magic/tentacle/gun //the item that shot it
|
||||
var/obj/item/gun/magic/tentacle/gun //the item that shot it
|
||||
|
||||
/obj/item/ammo_casing/magic/tentacle/Initialize()
|
||||
gun = loc
|
||||
@@ -380,7 +380,7 @@
|
||||
dna_cost = 1
|
||||
req_human = 1
|
||||
|
||||
weapon_type = /obj/item/weapon/shield/changeling
|
||||
weapon_type = /obj/item/shield/changeling
|
||||
weapon_name_simple = "shield"
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/shield/sting_action(mob/user)
|
||||
@@ -388,15 +388,15 @@
|
||||
if(!changeling)
|
||||
return
|
||||
|
||||
var/obj/item/weapon/shield/changeling/S = ..(user)
|
||||
var/obj/item/shield/changeling/S = ..(user)
|
||||
S.remaining_uses = round(changeling.absorbedcount * 3)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/shield/changeling
|
||||
/obj/item/shield/changeling
|
||||
name = "shield-like mass"
|
||||
desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
|
||||
flags = ABSTRACT | NODROP | DROPDEL
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
flags_1 = ABSTRACT_1 | NODROP_1 | DROPDEL_1
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "ling_shield"
|
||||
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
||||
@@ -404,12 +404,12 @@
|
||||
|
||||
var/remaining_uses //Set by the changeling ability.
|
||||
|
||||
/obj/item/weapon/shield/changeling/Initialize()
|
||||
/obj/item/shield/changeling/Initialize()
|
||||
. = ..()
|
||||
if(ismob(loc))
|
||||
loc.visible_message("<span class='warning'>The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!</span>", "<span class='warning'>We inflate our hand into a strong shield.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
|
||||
/obj/item/weapon/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(remaining_uses < 1)
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
@@ -443,8 +443,8 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacesuit"
|
||||
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
|
||||
flags = STOPSPRESSUREDMAGE | NODROP | DROPDEL //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals/emergency_oxygen, /obj/item/weapon/tank/internals/oxygen)
|
||||
flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Not THICKMATERIAL_1 because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90) //No armor at all.
|
||||
|
||||
/obj/item/clothing/suit/space/changeling/Initialize()
|
||||
@@ -462,7 +462,7 @@
|
||||
name = "flesh mass"
|
||||
icon_state = "lingspacehelmet"
|
||||
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
|
||||
flags = STOPSPRESSUREDMAGE | NODROP | DROPDEL //Again, no THICKMATERIAL.
|
||||
flags_1 = STOPSPRESSUREDMAGE_1 | NODROP_1 | DROPDEL_1 //Again, no THICKMATERIAL_1.
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 90, acid = 90)
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
|
||||
@@ -487,7 +487,7 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin."
|
||||
icon_state = "lingarmor"
|
||||
flags = NODROP | DROPDEL
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0, fire = 90, acid = 90)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
@@ -503,6 +503,6 @@
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||
icon_state = "lingarmorhelmet"
|
||||
flags = NODROP | DROPDEL
|
||||
flags_1 = NODROP_1 | DROPDEL_1
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0, fire = 90, acid = 90)
|
||||
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE
|
||||
|
||||
@@ -109,11 +109,11 @@
|
||||
chemical_cost = 20
|
||||
dna_cost = 1
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/false
|
||||
/obj/item/melee/arm_blade/false
|
||||
desc = "A grotesque mass of flesh that used to be your arm. Although it looks dangerous at first, you can tell it's actually quite dull and useless."
|
||||
force = 5 //Basically as strong as a punch
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
|
||||
/obj/item/melee/arm_blade/false/afterattack(atom/target, mob/user, proximity)
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target)
|
||||
@@ -134,7 +134,7 @@
|
||||
if(ismonkey(target))
|
||||
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
|
||||
|
||||
var/obj/item/weapon/melee/arm_blade/false/blade = new(target,1)
|
||||
var/obj/item/melee/arm_blade/false/blade = new(target,1)
|
||||
target.put_in_hands(blade)
|
||||
target.visible_message("<span class='warning'>A grotesque blade forms around [target.name]\'s arm!</span>", "<span class='userdanger'>Your arm twists and mutates, transforming into a horrific monstrosity!</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
@@ -142,7 +142,7 @@
|
||||
addtimer(CALLBACK(src, .proc/remove_fake, target, blade), 600)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/weapon/melee/arm_blade/false/blade)
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade)
|
||||
playsound(target, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
target.visible_message("<span class='warning'>With a sickening crunch, \
|
||||
[target] reforms their [blade.name] into an arm!</span>",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
/obj/item/clothing/glasses/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/glasses/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
/obj/item/clothing/under/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/under/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
/obj/item/clothing/suit/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
/obj/item/clothing/suit/changeling/attack_hand(mob/user)
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
/obj/item/clothing/head/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/head/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/shoes/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
/obj/item/clothing/gloves/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/gloves/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
/obj/item/clothing/mask/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
/obj/item/clothing/mask/changeling/attack_hand(mob/user)
|
||||
if(loc == user && user.mind && user.mind.changeling)
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
/obj/item/changeling
|
||||
name = "flesh"
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
slot_flags = ALL
|
||||
allowed = list(/obj/item/changeling)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//an "overlay" used by clockwork walls and floors to appear normal to mesons.
|
||||
/obj/effect/clockwork/overlay
|
||||
mouse_opacity = 0
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/atom/linked
|
||||
|
||||
/obj/effect/clockwork/overlay/examine(mob/user)
|
||||
|
||||
@@ -11,9 +11,21 @@
|
||||
var/stat_affected = CONSCIOUS
|
||||
var/sigil_name = "Sigil"
|
||||
var/resist_string = "glows blinding white" //string for when a null rod blocks its effects, "glows [resist_string]"
|
||||
var/list/component_refund = list()
|
||||
|
||||
/obj/effect/clockwork/sigil/attackby(obj/item/I, mob/living/user, params)
|
||||
if(I.force && !is_servant_of_ratvar(user))
|
||||
if(is_servant_of_ratvar(user))
|
||||
if(istype(I, /obj/item/clockwork/slab))
|
||||
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
|
||||
for(var/i in component_refund)
|
||||
if(component_refund[i])
|
||||
for(var/r in 1 to component_refund[i])
|
||||
generate_cache_component(i, src)
|
||||
qdel(src)
|
||||
return 1
|
||||
else if(I.force)
|
||||
user.visible_message("<span class='warning'>[user] scatters [src] with [I]!</span>", "<span class='danger'>You scatter [src] with [I]!</span>")
|
||||
qdel(src)
|
||||
return 1
|
||||
@@ -63,6 +75,7 @@
|
||||
light_power = 1
|
||||
light_color = "#FAE48C"
|
||||
sigil_name = "Sigil of Transgression"
|
||||
component_refund = list(HIEROPHANT_ANSIBLE = 1)
|
||||
|
||||
/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L)
|
||||
var/target_flashed = L.flash_act()
|
||||
@@ -94,12 +107,18 @@
|
||||
light_color = "#FAE48C"
|
||||
stat_affected = UNCONSCIOUS
|
||||
resist_string = "glows faintly yellow"
|
||||
sigil_name = "Sigil of Submission"
|
||||
component_refund = list(GEIS_CAPACITOR = 1)
|
||||
var/convert_time = 80
|
||||
var/delete_on_finish = TRUE
|
||||
sigil_name = "Sigil of Submission"
|
||||
var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission
|
||||
|
||||
/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L)
|
||||
if(istype(L.buckled, /obj/structure/destructible/clockwork/geis_binding))
|
||||
if(is_servant_of_ratvar(L.pulledby))
|
||||
L.pulledby.stop_pulling()
|
||||
if(is_servant_of_ratvar(L.buckled.pulledby))
|
||||
L.buckled.pulledby.stop_pulling()
|
||||
L.visible_message("<span class='warning'>[src] begins to glow a piercing magenta!</span>", "<span class='sevtug'>You feel something start to invade your mind...</span>")
|
||||
var/oldcolor = color
|
||||
animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW)
|
||||
@@ -108,10 +127,10 @@
|
||||
glow = new glow_type(get_turf(src))
|
||||
animate(glow, alpha = 255, time = convert_time)
|
||||
var/I = 0
|
||||
while(I < convert_time && get_turf(L) == get_turf(src))
|
||||
while(I < convert_time && !QDELETED(L) && get_turf(L) == get_turf(src))
|
||||
I++
|
||||
sleep(1)
|
||||
if(get_turf(L) != get_turf(src))
|
||||
if(QDELETED(L) || get_turf(L) != get_turf(src))
|
||||
if(glow)
|
||||
qdel(glow)
|
||||
animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW)
|
||||
@@ -152,6 +171,7 @@
|
||||
light_color = "#EC8A2D"
|
||||
resist_string = "glows faintly"
|
||||
sigil_name = "Sigil of Transmission"
|
||||
component_refund = list(HIEROPHANT_ANSIBLE = 1)
|
||||
affects_servants = TRUE
|
||||
var/power_charge = 0 //starts with no power
|
||||
var/drain_range = 14
|
||||
@@ -296,6 +316,7 @@
|
||||
stat_affected = DEAD
|
||||
resist_string = "glows shimmering yellow"
|
||||
sigil_name = "Vitality Matrix"
|
||||
component_refund = list(VANGUARD_COGWHEEL = 1)
|
||||
var/revive_cost = 150
|
||||
var/sigil_active = FALSE
|
||||
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/nullrod))
|
||||
if(istype(I, /obj/item/nullrod))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src] with [I]!</span>", "<span class='danger'>You close [src] with [I]!</span>")
|
||||
qdel(linked_gateway)
|
||||
qdel(src)
|
||||
@@ -98,12 +98,12 @@
|
||||
if(severity == 1 && uses)
|
||||
uses = 0
|
||||
visible_message("<span class='warning'>[src] is disrupted!</span>")
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
deltimer(timerid)
|
||||
timerid = QDEL_IN(src, 10)
|
||||
linked_gateway.uses = 0
|
||||
linked_gateway.visible_message("<span class='warning'>[linked_gateway] is disrupted!</span>")
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
deltimer(linked_gateway.timerid)
|
||||
linked_gateway.timerid = QDEL_IN(linked_gateway, 10)
|
||||
return TRUE
|
||||
@@ -130,13 +130,19 @@
|
||||
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
|
||||
playsound(linked_gateway, 'sound/effects/empulse.ogg', 50, 1)
|
||||
transform = matrix() * 1.5
|
||||
animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
|
||||
linked_gateway.transform = matrix() * 1.5
|
||||
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
|
||||
A.forceMove(get_turf(linked_gateway))
|
||||
if(!no_cost)
|
||||
uses = max(0, uses - 1)
|
||||
linked_gateway.uses = max(0, linked_gateway.uses - 1)
|
||||
if(!uses)
|
||||
animate(src, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
density = FALSE
|
||||
linked_gateway.density = FALSE
|
||||
else
|
||||
animate(src, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
addtimer(CALLBACK(src, .proc/check_uses), 10)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops
|
||||
/atom/movable/proc/power_drain(clockcult_user)
|
||||
var/obj/item/weapon/stock_parts/cell/cell = get_cell()
|
||||
var/obj/item/stock_parts/cell/cell = get_cell()
|
||||
if(cell)
|
||||
return cell.power_drain(clockcult_user)
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes
|
||||
/obj/item/melee/baton/power_drain(clockcult_user) //balance memes
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes
|
||||
/obj/item/gun/power_drain(clockcult_user) //balance memes
|
||||
return 0
|
||||
|
||||
/obj/machinery/power/apc/power_drain(clockcult_user)
|
||||
@@ -34,7 +34,7 @@
|
||||
visible_message("<span class='warning'>[src]'s panel flies open with a flurry of sparks!</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/stock_parts/cell/power_drain(clockcult_user)
|
||||
/obj/item/stock_parts/cell/power_drain(clockcult_user)
|
||||
if(charge)
|
||||
. = min(charge, MIN_CLOCKCULT_POWER*3)
|
||||
charge = use(.)
|
||||
|
||||
@@ -27,9 +27,6 @@
|
||||
/turf/closed/wall/mineral/cult/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //no metal
|
||||
return list("operation_time" = 80, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = SOUTH)
|
||||
|
||||
/turf/closed/wall/shuttle/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //two sheets of metal
|
||||
return list("operation_time" = 50, "new_obj_type" = /turf/closed/wall/clockwork, "power_cost" = POWER_WALL_TOTAL - (POWER_METAL * 2), "spawn_dir" = SOUTH)
|
||||
|
||||
/turf/closed/wall/r_wall/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
|
||||
return FALSE
|
||||
|
||||
@@ -328,7 +325,7 @@
|
||||
return
|
||||
if(health == maxHealth)
|
||||
return FALSE
|
||||
else if(!(flags & GODMODE))
|
||||
else if(!(flags_1 & GODMODE))
|
||||
user.visible_message("<span class='notice'>[user]'s [fabricator.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
fabricator.repairing = src
|
||||
|
||||
@@ -365,7 +365,7 @@
|
||||
return
|
||||
if(health == maxHealth)
|
||||
return FALSE
|
||||
else if(!(flags & GODMODE))
|
||||
else if(!(flags_1 & GODMODE))
|
||||
user.visible_message("<span class='notice'>[user]'s [proselytizer.name] starts coverin[src == user ? "g [user.p_them()]" : "g [src]"] in glowing orange energy...</span>", \
|
||||
"<span class='alloy'>You start repairin[src == user ? "g yourself" : "g [src]"]...</span>")
|
||||
proselytizer.repairing = src
|
||||
|
||||
@@ -24,15 +24,10 @@
|
||||
//For the Geis scripture; binds a target to convert.
|
||||
/obj/effect/proc_holder/slab/geis
|
||||
ranged_mousepointer = 'icons/effects/geis_target.dmi'
|
||||
var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding
|
||||
var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not
|
||||
|
||||
/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg)
|
||||
..()
|
||||
binding = null
|
||||
pulled_binding = null
|
||||
|
||||
/obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target)
|
||||
if(..())
|
||||
return TRUE
|
||||
var/turf/T = ranged_ability_user.loc
|
||||
if(!isturf(T))
|
||||
return TRUE
|
||||
@@ -40,20 +35,6 @@
|
||||
var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding)
|
||||
|
||||
if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target))
|
||||
if(in_progress || ..())
|
||||
var/mob/living/L = target
|
||||
if(!pulled_binding)
|
||||
if(target == binding || (isliving(target) && L.buckled == binding))
|
||||
pulled_binding = binding
|
||||
ranged_ability_user.start_pulling(binding)
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding))
|
||||
ranged_ability_user.visible_message("<span class='warning'>[ranged_ability_user] dispels [pulled_binding]!</span>", "<span class='danger'>You dispel the binding!</span>")
|
||||
binding.take_damage(obj_integrity)
|
||||
remove_ranged_ability()
|
||||
return TRUE
|
||||
if(target_is_binding)
|
||||
var/obj/structure/destructible/clockwork/geis_binding/GB = target
|
||||
GB.repair_and_interrupt()
|
||||
@@ -80,42 +61,19 @@
|
||||
add_logs(ranged_ability_user, L, "rebound with Geis")
|
||||
successful = TRUE
|
||||
else
|
||||
in_progress = TRUE
|
||||
clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!"))
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
add_logs(ranged_ability_user, L, "bound with Geis")
|
||||
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5)
|
||||
playsound(target, 'sound/magic/blink.ogg', 50, TRUE, -4, frequency = 0.5)
|
||||
if(slab.speed_multiplier >= 0.5) //excuse my debug...
|
||||
ranged_ability_user.notransform = TRUE
|
||||
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately
|
||||
addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 4) //stop us moving for a little bit so we don't break the binding immediately
|
||||
if(L.buckled)
|
||||
L.buckled.unbuckle_mob(target, TRUE)
|
||||
binding = new(get_turf(target))
|
||||
var/obj/structure/destructible/clockwork/geis_binding/binding = new(get_turf(target))
|
||||
binding.setDir(target.dir)
|
||||
binding.buckle_mob(target, TRUE)
|
||||
pulled_binding = binding
|
||||
ranged_ability_user.start_pulling(binding)
|
||||
slab.busy = "sustaining Geis"
|
||||
slab.flags |= NODROP
|
||||
while(!QDELETED(binding) && !QDELETED(ranged_ability_user))
|
||||
if(ranged_ability_user.pulling == binding)
|
||||
pulled_binding = binding
|
||||
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi')
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target_remove.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
else //if we're not pulling it, swap our mousepointer
|
||||
pulled_binding = null
|
||||
if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi')
|
||||
remove_mousepointer(ranged_ability_user.client)
|
||||
ranged_mousepointer = 'icons/effects/geis_target.dmi'
|
||||
add_mousepointer(ranged_ability_user.client)
|
||||
sleep(1)
|
||||
if(!QDELETED(slab))
|
||||
slab.flags &= ~NODROP
|
||||
in_progress = FALSE
|
||||
ranged_ability_user.apply_status_effect(STATUS_EFFECT_GEISTRACKER, binding)
|
||||
successful = TRUE
|
||||
|
||||
remove_ranged_ability()
|
||||
@@ -182,7 +140,7 @@
|
||||
playsound(targetturf, 'sound/magic/staff_healing.ogg', 50, 1)
|
||||
|
||||
if(has_holy_water)
|
||||
L.reagents.remove_reagent("holywater", 1000)
|
||||
L.reagents.del_reagent("holywater")
|
||||
|
||||
remove_ranged_ability()
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
to_chat(user, "<span class='[message_span]'>[cultist_message]</span>")
|
||||
if(user.mind && user.mind.isholy)
|
||||
to_chat(user, "<span class='boldannounce'>The power of your faith melts away the [src]!</span>")
|
||||
var/obj/item/weapon/ore/slag/wrath = new /obj/item/weapon/ore/slag
|
||||
var/obj/item/ore/slag/wrath = new /obj/item/ore/slag
|
||||
qdel(src)
|
||||
user.put_in_active_hand(wrath)
|
||||
if(is_servant_of_ratvar(user) && prob(20))
|
||||
|
||||
@@ -20,12 +20,12 @@
|
||||
/obj/item/clothing/head/helmet/clockwork/ratvar_act()
|
||||
if(GLOB.ratvar_awakens)
|
||||
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
|
||||
flags |= STOPSPRESSUREDMAGE
|
||||
flags_1 |= STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
else
|
||||
armor = list(melee = 80, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
flags &= ~STOPSPRESSUREDMAGE
|
||||
flags_1 &= ~STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = initial(max_heat_protection_temperature)
|
||||
min_cold_protection_temperature = initial(min_cold_protection_temperature)
|
||||
|
||||
@@ -76,12 +76,12 @@
|
||||
/obj/item/clothing/suit/armor/clockwork/ratvar_act()
|
||||
if(GLOB.ratvar_awakens)
|
||||
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
|
||||
flags |= STOPSPRESSUREDMAGE
|
||||
flags_1 |= STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
else
|
||||
armor = list(melee = 80, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
flags &= ~STOPSPRESSUREDMAGE
|
||||
flags_1 &= ~STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = initial(max_heat_protection_temperature)
|
||||
min_cold_protection_temperature = initial(min_cold_protection_temperature)
|
||||
|
||||
@@ -137,12 +137,12 @@
|
||||
/obj/item/clothing/gloves/clockwork/ratvar_act()
|
||||
if(GLOB.ratvar_awakens)
|
||||
armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100)
|
||||
flags |= STOPSPRESSUREDMAGE
|
||||
flags_1 |= STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
|
||||
else
|
||||
armor = list(melee = 80, bullet = 70, laser = -25, energy = 0, bomb = 60, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
flags &= ~STOPSPRESSUREDMAGE
|
||||
flags_1 &= ~STOPSPRESSUREDMAGE_1
|
||||
max_heat_protection_temperature = initial(max_heat_protection_temperature)
|
||||
min_cold_protection_temperature = initial(min_cold_protection_temperature)
|
||||
|
||||
@@ -192,9 +192,9 @@
|
||||
|
||||
/obj/item/clothing/shoes/clockwork/ratvar_act()
|
||||
if(GLOB.ratvar_awakens)
|
||||
flags |= NOSLIP
|
||||
flags_1 |= NOSLIP_1
|
||||
else
|
||||
flags &= ~NOSLIP
|
||||
flags_1 &= ~NOSLIP_1
|
||||
|
||||
/obj/item/clothing/shoes/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
|
||||
if(equipper && !is_servant_of_ratvar(equipper))
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
diff a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm (rejected hunks)
|
||||
@@ -6,6 +6,8 @@
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "ratvarian_spear"
|
||||
item_state = "ratvarian_spear"
|
||||
+ lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi'
|
||||
+ righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
|
||||
force = 15 //Extra damage is dealt to targets in attack()
|
||||
throwforce = 25
|
||||
armour_penetration = 10
|
||||
@@ -8,7 +8,7 @@
|
||||
righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
force = 5
|
||||
flags = NOBLUDGEON
|
||||
flags_1 = NOBLUDGEON_1
|
||||
var/stored_power = 0 //Requires power to function
|
||||
var/max_power = CLOCKCULT_POWER_UNIT * 10
|
||||
var/uses_power = TRUE
|
||||
@@ -144,7 +144,7 @@
|
||||
to_chat(user, "<span class='brass'>You use [stored_power ? "some":"all"] of [src]'s power to produce <b>5</b> brass sheets. It now stores <b>[get_power()]W/[get_max_power()]W</b> of power.</span>")
|
||||
|
||||
/obj/item/clockwork/replica_fabricator/pre_attackby(atom/target, mob/living/user, params)
|
||||
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/weapon/storage))
|
||||
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/storage))
|
||||
return TRUE
|
||||
return fabricate(target, user)
|
||||
|
||||
@@ -297,7 +297,7 @@
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>[L] does not serve Ratvar!</span>")
|
||||
return FALSE
|
||||
if(L.health >= L.maxHealth || (L.flags & GODMODE))
|
||||
if(L.health >= L.maxHealth || (L.flags_1 & GODMODE))
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>[L == user ? "You are" : "[L] is"] at maximum health!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(amount > 0)
|
||||
for(var/mob/living/L in view(2, src))
|
||||
if(L.is_holding_item_of_type(/obj/item/weapon/nullrod))
|
||||
if(L.is_holding_item_of_type(/obj/item/nullrod))
|
||||
to_chat(src, "<span class='userdanger'>The presence of a brandished holy artifact weakens your armor!</span>")
|
||||
amount *= 4 //if a wielded null rod is nearby, it takes four times the health damage
|
||||
break
|
||||
@@ -258,7 +258,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/nullrod) || !blockOrCounter(user, I))
|
||||
if(istype(I, /obj/item/nullrod) || !blockOrCounter(user, I))
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/blockOrCounter(mob/target, atom/textobject)
|
||||
|
||||
@@ -57,6 +57,9 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or
|
||||
if(slab.busy)
|
||||
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"[slab.busy]!\"</span>")
|
||||
return FALSE
|
||||
if(invoker.has_status_effect(STATUS_EFFECT_GEISTRACKER))
|
||||
to_chat(invoker, "<span class='warning'>[slab] refuses to work, displaying the message: \"Sustaining Geis!\"</span>")
|
||||
return FALSE
|
||||
slab.busy = "Invocation ([name]) in progress"
|
||||
if(GLOB.ratvar_awakens)
|
||||
channel_time *= 0.5 //if ratvar has awoken, half channel time and no cost
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/attackby(obj/item/I, mob/user, params)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/weapon/wrench) && unanchored_icon)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/wrench) && unanchored_icon)
|
||||
if(default_unfasten_wrench(user, I, 50) == SUCCESSFUL_UNFASTEN)
|
||||
update_anchored(user)
|
||||
return 1
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
desc = "A massive, thrumming rip in spacetime."
|
||||
clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits."
|
||||
max_integrity = 500
|
||||
mouse_opacity = 2
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
||||
icon = 'icons/effects/clockwork_effects.dmi'
|
||||
icon_state = "nothing"
|
||||
density = FALSE
|
||||
@@ -68,7 +68,7 @@
|
||||
if(!purpose_fulfilled)
|
||||
var/area/gate_area = get_area(src)
|
||||
hierophant_message("<span class='large_brass'><b>An Ark of the Clockwork Justicar has fallen at [gate_area.map_name]!</b></span>")
|
||||
send_to_playing_players(sound(null, 0, channel = CHANNEL_JUSTICAR_ARK))
|
||||
sound_to_playing_players(channel = CHANNEL_JUSTICAR_ARK, S = sound(null, 0))
|
||||
var/was_stranded = SSshuttle.emergency.mode == SHUTTLE_STRANDED
|
||||
SSshuttle.clearHostileEnvironment(src)
|
||||
if(!was_stranded && !purpose_fulfilled)
|
||||
@@ -82,12 +82,12 @@
|
||||
. = ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/celestial_gateway/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!disassembled)
|
||||
resistance_flags |= INDESTRUCTIBLE
|
||||
countdown.stop()
|
||||
visible_message("<span class='userdanger'>[src] begins to pulse uncontrollably... you might want to run!</span>")
|
||||
send_to_playing_players(sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = CHANNEL_JUSTICAR_ARK, volume = 50))
|
||||
sound_to_playing_players(volume = 50, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_disrupted.ogg', 0))
|
||||
make_glow()
|
||||
glow.icon_state = "clockwork_gateway_disrupted"
|
||||
resistance_flags |= INDESTRUCTIBLE
|
||||
@@ -208,7 +208,7 @@
|
||||
if(still_needs_components())
|
||||
if(!first_sound_played)
|
||||
priority_announce("Massive energy anomaly detected on short-range scanners. Attempting to triangulate location...", "Anomaly Alert")
|
||||
send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 10))
|
||||
sound_to_playing_players(volume = 10, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', 1))
|
||||
first_sound_played = TRUE
|
||||
make_glow()
|
||||
glow.icon_state = "clockwork_gateway_components"
|
||||
@@ -228,7 +228,8 @@
|
||||
switch(progress_in_seconds)
|
||||
if(-INFINITY to GATEWAY_REEBE_FOUND)
|
||||
if(!second_sound_played)
|
||||
send_to_playing_players(sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 30))
|
||||
new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
|
||||
sound_to_playing_players(volume = 30, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_charging.ogg', 1))
|
||||
second_sound_played = TRUE
|
||||
make_glow()
|
||||
glow.icon_state = "clockwork_gateway_charging"
|
||||
@@ -236,13 +237,15 @@
|
||||
if(!third_sound_played)
|
||||
var/area/gate_area = get_area(src)
|
||||
priority_announce("Location of massive energy anomaly has been triangulated. Location: [gate_area.map_name].", "Anomaly Alert")
|
||||
send_to_playing_players(sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 35))
|
||||
new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
|
||||
sound_to_playing_players(volume = 35, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_active.ogg', 1))
|
||||
third_sound_played = TRUE
|
||||
make_glow()
|
||||
glow.icon_state = "clockwork_gateway_active"
|
||||
if(GATEWAY_RATVAR_COMING to GATEWAY_RATVAR_ARRIVAL)
|
||||
if(!fourth_sound_played)
|
||||
send_to_playing_players(sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = CHANNEL_JUSTICAR_ARK, volume = 40))
|
||||
new /obj/effect/temp_visual/decoy/fading/threesecond(loc, glow)
|
||||
sound_to_playing_players(volume = 40, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/clockcult_gateway_closing.ogg', 1))
|
||||
fourth_sound_played = TRUE
|
||||
make_glow()
|
||||
glow.icon_state = "clockwork_gateway_closing"
|
||||
@@ -252,20 +255,20 @@
|
||||
resistance_flags |= INDESTRUCTIBLE
|
||||
purpose_fulfilled = TRUE
|
||||
make_glow()
|
||||
animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125)
|
||||
send_to_playing_players(sound('sound/effects/ratvar_rises.ogg', 0, channel = CHANNEL_JUSTICAR_ARK)) //End the sounds
|
||||
animate(glow, transform = matrix() * 3, time = 125)
|
||||
sound_to_playing_players('sound/effects/ratvar_rises.ogg', channel = CHANNEL_JUSTICAR_ARK) //End the sounds
|
||||
sleep(125)
|
||||
make_glow()
|
||||
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
|
||||
var/turf/startpoint = get_turf(src)
|
||||
QDEL_IN(src, 3)
|
||||
sleep(3)
|
||||
make_glow()
|
||||
glow.transform = matrix() * 4.5
|
||||
animate(glow, transform = matrix() * 0.1, time = 10)
|
||||
QDEL_IN(src, 10)
|
||||
GLOB.clockwork_gateway_activated = TRUE
|
||||
new/obj/structure/destructible/clockwork/massive/ratvar(startpoint)
|
||||
send_to_playing_players("<span class='inathneq_large'>\"[text2ratvar("See Engine's mercy")]!\"</span>\n\
|
||||
<span class='sevtug_large'>\"[text2ratvar("Observe Engine's design skills")]!\"</span>\n<span class='nezbere_large'>\"[text2ratvar("Behold Engine's light")]!!\"</span>\n\
|
||||
<span class='nzcrentr_large'>\"[text2ratvar("Gaze upon Engine's power")].\"</span>")
|
||||
send_to_playing_players('sound/magic/clockwork/invoke_general.ogg')
|
||||
sound_to_playing_players('sound/effects/empulse.ogg')
|
||||
var/x0 = startpoint.x
|
||||
var/y0 = startpoint.y
|
||||
for(var/I in spiral_range_turfs(255, startpoint))
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
/obj/structure/destructible/clockwork/geis_binding
|
||||
name = "glowing ring"
|
||||
desc = "A flickering, glowing purple ring around a target."
|
||||
clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted."
|
||||
max_integrity = 25
|
||||
clockwork_desc = "A binding ring around a target, preventing them from taking action."
|
||||
max_integrity = 20
|
||||
light_range = 2
|
||||
light_power = 0.8
|
||||
light_color = "#AF0AAF"
|
||||
@@ -18,6 +18,8 @@
|
||||
can_buckle = TRUE
|
||||
buckle_lying = 0
|
||||
var/mob_layer = MOB_LAYER
|
||||
var/last_mob_health = 0
|
||||
var/apply_time = 0
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab)
|
||||
. = ..()
|
||||
@@ -33,21 +35,39 @@
|
||||
icon_state = "geisbinding"
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/process()
|
||||
var/tick_damage = 1
|
||||
if(locate(/obj/effect/clockwork/sigil/submission) in loc)
|
||||
tick_damage *= 0.5
|
||||
if(LAZYLEN(buckled_mobs))
|
||||
for(var/V in buckled_mobs)
|
||||
var/mob/living/L = V
|
||||
if(is_servant_of_ratvar(L)) //servants are freed automatically
|
||||
take_damage(obj_integrity)
|
||||
return
|
||||
var/tick_damage = 1
|
||||
if(!is_servant_of_ratvar(pulledby))
|
||||
tick_damage++
|
||||
if(last_mob_health > L.health)
|
||||
tick_damage += last_mob_health - L.health
|
||||
last_mob_health = L.health
|
||||
if(L.layer != mob_layer)
|
||||
mob_layer = L.layer
|
||||
layer = mob_layer - 0.01
|
||||
cut_overlays()
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
|
||||
break
|
||||
take_damage(tick_damage, sound_effect = FALSE)
|
||||
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE)
|
||||
playsound(src, 'sound/effects/empulse.ogg', tick_damage * 40, TRUE, -4)
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user)
|
||||
return
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/attackby(obj/item/I, mob/user, params)
|
||||
if(is_servant_of_ratvar(user) && istype(I, /obj/item/clockwork/slab))
|
||||
user.visible_message("<span class='warning'>[user] starts to dispel [src]...</span>", "<span class='danger'>You start to dispel [src]...</span>")
|
||||
if(do_after(user, 30, target = src))
|
||||
user.visible_message("<span class='warning'>[user] dispels [src]!</span>", "<span class='danger'>You dispel [src]!</span>")
|
||||
take_damage(obj_integrity)
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/emp_act(severity)
|
||||
new /obj/effect/temp_visual/emp(loc)
|
||||
qdel(src)
|
||||
@@ -56,16 +76,22 @@
|
||||
..()
|
||||
if(M.buckled == src)
|
||||
desc = "A flickering, glowing purple ring around [M]."
|
||||
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action while [M.p_theyre()] being converted."
|
||||
clockwork_desc = "A binding ring around [M], preventing [M.p_them()] from taking action."
|
||||
icon_state = "geisbinding"
|
||||
mob_layer = M.layer
|
||||
layer = M.layer - 0.01
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", M.layer + 0.01))
|
||||
layer = mob_layer - 0.01
|
||||
add_overlay(mutable_appearance('icons/effects/clockwork_effects.dmi', "geisbinding_top", mob_layer + 0.01))
|
||||
last_mob_health = M.health
|
||||
apply_time = world.time
|
||||
for(var/obj/item/I in M.held_items)
|
||||
M.dropItemToGround(I)
|
||||
for(var/i in M.get_empty_held_indexes())
|
||||
var/obj/item/geis_binding/B = new(M)
|
||||
M.put_in_hands(B, i)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/energy/clock(C)
|
||||
M.regenerate_icons()
|
||||
M.visible_message("<span class='warning'>A [name] appears around [M]!</span>", "<span class='warning'>A [name] appears around you!</span>")
|
||||
repair_and_interrupt()
|
||||
@@ -79,8 +105,17 @@
|
||||
animate(G, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
|
||||
animate(T, transform = matrix()*2, alpha = 0, time = 8, easing = EASE_OUT)
|
||||
M.visible_message("<span class='warning'>[src] snaps into glowing pieces and dissipates!</span>")
|
||||
M.AdjustStun(-130 + (apply_time - world.time), 1, 1) //remove exactly as much stun as was applied
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
C.silent = max(C.silent - 7, 0)
|
||||
for(var/obj/item/geis_binding/GB in M.held_items)
|
||||
M.dropItemToGround(GB, TRUE)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/C = M
|
||||
if(istype(C.handcuffed, /obj/item/restraints/handcuffs/energy/clock))
|
||||
QDEL_NULL(C.handcuffed)
|
||||
C.update_handcuffed()
|
||||
|
||||
/obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
playsound(src, 'sound/effects/empulse.ogg', 50, 1)
|
||||
@@ -126,7 +161,14 @@
|
||||
desc = "A flickering ring preventing you from holding items."
|
||||
icon = 'icons/effects/clockwork_effects.dmi'
|
||||
icon_state = "geisbinding_full"
|
||||
flags = NODROP|ABSTRACT|DROPDEL
|
||||
flags_1 = NODROP_1|ABSTRACT_1|DROPDEL_1
|
||||
|
||||
/obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params)
|
||||
return FALSE
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/clock
|
||||
name = "glowing rings"
|
||||
desc = "Flickering rings preventing you from holding items."
|
||||
icon = 'icons/effects/clockwork_effects.dmi'
|
||||
icon_state = "geisbinding_full"
|
||||
flags_1 = NODROP_1|ABSTRACT_1|DROPDEL_1
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
if(O.emped || !O.on)
|
||||
continue
|
||||
O.emp_act(EMP_HEAVY)
|
||||
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/storage)) //other things may have radios in them but we don't care
|
||||
else if((isliving(A) && !is_servant_of_ratvar(A)) || istype(A, /obj/structure/closet) || istype(A, /obj/item/storage)) //other things may have radios in them but we don't care
|
||||
for(var/obj/item/device/radio/O in A.GetAllContents())
|
||||
successfulprocess = TRUE
|
||||
if(O.emped || !O.on)
|
||||
|
||||
@@ -102,11 +102,11 @@
|
||||
/obj/structure/destructible/clockwork/ocular_warden/proc/acquire_nearby_targets()
|
||||
. = list()
|
||||
for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind
|
||||
var/obj/item/weapon/storage/book/bible/B = L.bible_check()
|
||||
var/obj/item/storage/book/bible/B = L.bible_check()
|
||||
if(B)
|
||||
if(!(B.resistance_flags & ON_FIRE))
|
||||
to_chat(L, "<span class='warning'>Your [B.name] bursts into flames!</span>")
|
||||
for(var/obj/item/weapon/storage/book/bible/BI in L.GetAllContents())
|
||||
for(var/obj/item/storage/book/bible/BI in L.GetAllContents())
|
||||
if(!(BI.resistance_flags & ON_FIRE))
|
||||
BI.fire_act()
|
||||
continue
|
||||
|
||||
@@ -130,6 +130,6 @@
|
||||
if(hex_combo) //YOU BUILT A HEXAGON
|
||||
hex_combo.pixel_x = -16
|
||||
hex_combo.pixel_y = -16
|
||||
hex_combo.mouse_opacity = 0
|
||||
hex_combo.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
hex_combo.plane = GAME_PLANE
|
||||
new /obj/effect/temp_visual/ratvar/prolonging_prism(T, hex_combo)
|
||||
|
||||
@@ -23,12 +23,12 @@
|
||||
for(var/obj/O in GLOB.all_clockwork_objects)
|
||||
O.ratvar_act()
|
||||
START_PROCESSING(SSobj, src)
|
||||
INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0, null, FALSE, 0)
|
||||
send_to_playing_players("<span class='ratvar'>\"[text2ratvar("ONCE AGAIN MY LIGHT SHALL SHINE ACROSS THIS PATHETIC REALM")]!!\"</span>")
|
||||
sound_to_playing_players('sound/effects/ratvar_reveal.ogg')
|
||||
var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/clockwork_effects.dmi', "ratvar_alert")
|
||||
var/area/A = get_area(src)
|
||||
notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay)
|
||||
INVOKE_ASYNC(SSshuttle.emergency, /obj/docking_port/mobile/emergency.proc/request, null, 0, null, FALSE, 0)
|
||||
|
||||
/obj/structure/destructible/clockwork/massive/ratvar/Destroy()
|
||||
GLOB.ratvar_awakens--
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
return
|
||||
|
||||
/obj/structure/destructible/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/wrench))
|
||||
if(istype(I, /obj/item/wrench))
|
||||
default_unfasten_wrench(user, I, 10)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/weapon/screwdriver))
|
||||
else if(istype(I, /obj/item/screwdriver))
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
|
||||
else
|
||||
@@ -70,6 +70,6 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/destructible/clockwork/wall_gear/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT) && disassembled)
|
||||
if(!(flags_1 & NODECONSTRUCT_1) && disassembled)
|
||||
new /obj/item/stack/tile/brass(loc, 3)
|
||||
return ..()
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
if(tome)
|
||||
. += cult_give_item(/obj/item/weapon/tome, mob)
|
||||
. += cult_give_item(/obj/item/tome, mob)
|
||||
else
|
||||
. += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
|
||||
. += cult_give_item(/obj/item/paper/talisman/supply, mob)
|
||||
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
|
||||
|
||||
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
|
||||
@@ -146,7 +146,7 @@
|
||||
else
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].")
|
||||
if(where == "backpack")
|
||||
var/obj/item/weapon/storage/B = mob.back
|
||||
var/obj/item/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
B.show_to(mob)
|
||||
return 1
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
/obj/item/weapon/melee/cultblade
|
||||
/obj/item/melee/cultblade
|
||||
name = "eldritch longsword"
|
||||
desc = "A sword humming with unholy energy. It glows with a dim red light."
|
||||
icon_state = "cultblade"
|
||||
item_state = "cultblade"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
flags = CONDUCT
|
||||
lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
|
||||
inhand_x_dimension = 64
|
||||
inhand_y_dimension = 64
|
||||
flags_1 = CONDUCT_1
|
||||
sharpness = IS_SHARP
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 30
|
||||
@@ -14,7 +16,7 @@
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
|
||||
|
||||
|
||||
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
if(!iscultist(user))
|
||||
user.Knockdown(100)
|
||||
user.dropItemToGround(src, TRUE)
|
||||
@@ -28,12 +30,12 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/cultblade/ghost
|
||||
/obj/item/melee/cultblade/ghost
|
||||
name = "eldritch sword"
|
||||
force = 19 //can't break normal airlocks
|
||||
flags = NODROP|DROPDEL
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
|
||||
/obj/item/weapon/melee/cultblade/pickup(mob/living/user)
|
||||
/obj/item/melee/cultblade/pickup(mob/living/user)
|
||||
..()
|
||||
if(!iscultist(user))
|
||||
if(!is_servant_of_ratvar(user))
|
||||
@@ -47,17 +49,22 @@
|
||||
user.apply_damage(30, BRUTE, pick("l_arm", "r_arm"))
|
||||
user.dropItemToGround(src)
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger
|
||||
/obj/item/melee/cultblade/dagger
|
||||
name = "sacrificial dagger"
|
||||
desc = "A strange dagger said to be used by sinister groups for \"preparing\" a corpse before sacrificing it to their dark gods."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "render"
|
||||
item_state = "knife"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
inhand_x_dimension = 32
|
||||
inhand_y_dimension = 32
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
force = 15
|
||||
throwforce = 25
|
||||
embed_chance = 75
|
||||
|
||||
/obj/item/weapon/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
/obj/item/melee/cultblade/dagger/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
@@ -66,7 +73,7 @@
|
||||
C.reagents.add_reagent("heparin", 1)
|
||||
|
||||
|
||||
/obj/item/weapon/restraints/legcuffs/bola/cult
|
||||
/obj/item/restraints/legcuffs/bola/cult
|
||||
name = "nar'sien bola"
|
||||
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
|
||||
icon_state = "bola_cult"
|
||||
@@ -92,7 +99,7 @@
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
cold_protection = CHEST|GROIN|LEGS|ARMS
|
||||
@@ -108,7 +115,7 @@
|
||||
item_state = "cult_hoodalt"
|
||||
|
||||
/obj/item/clothing/head/culthood/alt/ghost
|
||||
flags = NODROP|DROPDEL
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt
|
||||
name = "cultist robes"
|
||||
@@ -117,7 +124,7 @@
|
||||
item_state = "cultrobesalt"
|
||||
|
||||
/obj/item/clothing/suit/cultrobes/alt/ghost
|
||||
flags = NODROP|DROPDEL
|
||||
flags_1 = NODROP_1|DROPDEL_1
|
||||
|
||||
|
||||
/obj/item/clothing/head/magus
|
||||
@@ -135,7 +142,7 @@
|
||||
icon_state = "magusred"
|
||||
item_state = "magusred"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0, fire = 10, acid = 10)
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
@@ -154,11 +161,11 @@
|
||||
item_state = "cult_armor"
|
||||
desc = "A heavily-armored exosuit worn by warriors of the Nar-Sien cult. It can withstand hard vacuum."
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade, /obj/item/weapon/tank/internals/)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals/)
|
||||
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 40, acid = 75)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
|
||||
|
||||
/obj/item/weapon/sharpener/cult
|
||||
/obj/item/sharpener/cult
|
||||
name = "eldritch whetstone"
|
||||
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
|
||||
icon_state = "cult_sharpener"
|
||||
@@ -167,7 +174,7 @@
|
||||
max = 40
|
||||
prefix = "darkened"
|
||||
|
||||
/obj/item/weapon/sharpener/cult/update_icon()
|
||||
/obj/item/sharpener/cult/update_icon()
|
||||
icon_state = "cult_sharpener[used ? "_used" : ""]"
|
||||
|
||||
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
@@ -178,7 +185,7 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
armor = list(melee = 50, bullet = 40, laser = 50,energy = 30, bomb = 50, bio = 30, rad = 30, fire = 50, acid = 60)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
var/current_charges = 3
|
||||
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
|
||||
|
||||
@@ -228,7 +235,7 @@
|
||||
icon_state = "cultrobes"
|
||||
item_state = "cultrobes"
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/weapon/tome, /obj/item/weapon/melee/cultblade)
|
||||
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS
|
||||
armor = list(melee = -50, bullet = -50, laser = -50,energy = -50, bomb = -50, bio = -50, rad = -50, fire = 0, acid = 0)
|
||||
slowdown = -1
|
||||
@@ -275,7 +282,7 @@
|
||||
user.Knockdown(100)
|
||||
user.blind_eyes(30)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
/obj/item/reagent_containers/food/drinks/bottle/unholywater
|
||||
name = "flask of unholy water"
|
||||
desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
|
||||
icon_state = "holyflask"
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
..()
|
||||
|
||||
/obj/structure/destructible/cult/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
if(istype(I, /obj/item/tome) && iscultist(user))
|
||||
anchored = !anchored
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.</span>")
|
||||
if(!anchored)
|
||||
@@ -78,11 +78,11 @@
|
||||
var/pickedtype
|
||||
switch(choice)
|
||||
if("Eldritch Whetstone")
|
||||
pickedtype = /obj/item/weapon/sharpener/cult
|
||||
pickedtype = /obj/item/sharpener/cult
|
||||
if("Zealot's Blindfold")
|
||||
pickedtype = /obj/item/clothing/glasses/night/cultblind
|
||||
if("Flask of Unholy Water")
|
||||
pickedtype = /obj/item/weapon/reagent_containers/food/drinks/bottle/unholywater
|
||||
pickedtype = /obj/item/reagent_containers/food/drinks/bottle/unholywater
|
||||
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
|
||||
cooldowntime = world.time + 2400
|
||||
var/obj/item/N = new pickedtype(get_turf(src))
|
||||
@@ -218,7 +218,7 @@
|
||||
var/list/pickedtype = list()
|
||||
switch(choice)
|
||||
if("Supply Talisman")
|
||||
pickedtype += /obj/item/weapon/paper/talisman/supply/weak
|
||||
pickedtype += /obj/item/paper/talisman/supply/weak
|
||||
if("Shuttle Curse")
|
||||
pickedtype += /obj/item/device/shuttle_curse
|
||||
if("Veil Walker Set")
|
||||
|
||||
@@ -5,7 +5,7 @@ This file contains the arcane tome files.
|
||||
*/
|
||||
|
||||
|
||||
/obj/item/weapon/tome
|
||||
/obj/item/tome
|
||||
name = "arcane tome"
|
||||
desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
|
||||
icon_state ="tome"
|
||||
@@ -13,7 +13,7 @@ This file contains the arcane tome files.
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/weapon/tome/Initialize()
|
||||
/obj/item/tome/Initialize()
|
||||
. = ..()
|
||||
if(!LAZYLEN(GLOB.rune_types))
|
||||
GLOB.rune_types = list()
|
||||
@@ -22,7 +22,7 @@ This file contains the arcane tome files.
|
||||
var/obj/effect/rune/R = i_can_do_loops_now_thanks_remie
|
||||
GLOB.rune_types[initial(R.cultist_name)] = R //Uses the cultist name for displaying purposes
|
||||
|
||||
/obj/item/weapon/tome/examine(mob/user)
|
||||
/obj/item/tome/examine(mob/user)
|
||||
..()
|
||||
if(iscultist(user) || isobserver(user))
|
||||
to_chat(user, "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>")
|
||||
@@ -30,7 +30,7 @@ This file contains the arcane tome files.
|
||||
to_chat(user, "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>")
|
||||
to_chat(user, "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>")
|
||||
|
||||
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
|
||||
/obj/item/tome/attack(mob/living/M, mob/living/user)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(!iscultist(user))
|
||||
@@ -51,13 +51,13 @@ This file contains the arcane tome files.
|
||||
user.do_attack_animation(M)
|
||||
add_logs(user, M, "smacked", src)
|
||||
|
||||
/obj/item/weapon/tome/attack_self(mob/user)
|
||||
/obj/item/tome/attack_self(mob/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='warning'>[src] seems full of unintelligible shapes, scribbles, and notes. Is this some sort of joke?</span>")
|
||||
return
|
||||
open_tome(user)
|
||||
|
||||
/obj/item/weapon/tome/proc/open_tome(mob/user)
|
||||
/obj/item/tome/proc/open_tome(mob/user)
|
||||
var/choice = alert(user,"You open the tome...",,"Scribe Rune","More Information","Cancel")
|
||||
switch(choice)
|
||||
if("More Information")
|
||||
@@ -67,7 +67,7 @@ This file contains the arcane tome files.
|
||||
if("Cancel")
|
||||
return
|
||||
|
||||
/obj/item/weapon/tome/proc/read_tome(mob/user)
|
||||
/obj/item/tome/proc/read_tome(mob/user)
|
||||
var/text = ""
|
||||
text += "<center><font color='red' size=3><b><i>Archives of the Dark One</i></b></font></center><br><br><br>"
|
||||
text += "A rune's name and effects can be revealed by examining the rune.<br><br>"
|
||||
@@ -171,7 +171,7 @@ This file contains the arcane tome files.
|
||||
popup.open()
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/tome/proc/scribe_rune(mob/living/user)
|
||||
/obj/item/tome/proc/scribe_rune(mob/living/user)
|
||||
var/turf/Turf = get_turf(user)
|
||||
var/chosen_keyword
|
||||
var/obj/effect/rune/rune_to_scribe
|
||||
@@ -248,7 +248,7 @@ This file contains the arcane tome files.
|
||||
to_chat(user, "<span class='cult'>The [lowertext(R.cultist_name)] rune [R.cultist_desc]</span>")
|
||||
SSblackbox.add_details("cult_runes_scribed", R.cultist_name)
|
||||
|
||||
/obj/item/weapon/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
/obj/item/tome/proc/check_rune_turf(turf/T, mob/user)
|
||||
if(isspaceturf(T))
|
||||
to_chat(user, "<span class='warning'>You cannot scribe runes in space!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -56,10 +56,10 @@ To draw a rune, use an arcane tome.
|
||||
to_chat(user, "<b>Keyword:</b> [keyword]")
|
||||
|
||||
/obj/effect/rune/attackby(obj/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
|
||||
if(istype(I, /obj/item/tome) && iscultist(user))
|
||||
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
|
||||
qdel(src)
|
||||
else if(istype(I, /obj/item/weapon/nullrod))
|
||||
else if(istype(I, /obj/item/nullrod))
|
||||
user.say("BEGONE FOUL MAGIKS!!")
|
||||
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
|
||||
qdel(src)
|
||||
@@ -175,13 +175,13 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
qdel(src)
|
||||
|
||||
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
|
||||
var/obj/item/weapon/nullrod/N = locate() in src
|
||||
var/obj/item/nullrod/N = locate() in src
|
||||
if(N && !GLOB.ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
|
||||
return N
|
||||
return 0
|
||||
|
||||
/mob/proc/bible_check() //The bible, if held, might protect against certain things
|
||||
var/obj/item/weapon/storage/book/bible/B = locate() in src
|
||||
var/obj/item/storage/book/bible/B = locate() in src
|
||||
if(is_holding(B))
|
||||
return B
|
||||
return 0
|
||||
@@ -198,7 +198,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/mob/living/user = invokers[1] //the first invoker is always the user
|
||||
var/list/papers_on_rune = checkpapers()
|
||||
var/entered_talisman_name
|
||||
var/obj/item/weapon/paper/talisman/talisman_type
|
||||
var/obj/item/paper/talisman/talisman_type
|
||||
var/list/possible_talismans = list()
|
||||
if(!papers_on_rune.len)
|
||||
to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
|
||||
@@ -211,8 +211,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
log_game("Talisman Creation rune failed - already in use")
|
||||
return
|
||||
|
||||
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply - /obj/item/weapon/paper/talisman/supply/weak - /obj/item/weapon/paper/talisman/summon_tome)
|
||||
var/obj/item/weapon/paper/talisman/J = I
|
||||
for(var/I in subtypesof(/obj/item/paper/talisman) - /obj/item/paper/talisman/malformed - /obj/item/paper/talisman/supply - /obj/item/paper/talisman/supply/weak - /obj/item/paper/talisman/summon_tome)
|
||||
var/obj/item/paper/talisman/J = I
|
||||
var/talisman_cult_name = initial(J.cultist_name)
|
||||
if(talisman_cult_name)
|
||||
possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name
|
||||
@@ -226,7 +226,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
fail_invoke()
|
||||
log_game("Talisman Creation rune failed - no blank papers on rune")
|
||||
return
|
||||
var/obj/item/weapon/paper/paper_to_imbue = papers_on_rune[1]
|
||||
var/obj/item/paper/paper_to_imbue = papers_on_rune[1]
|
||||
..()
|
||||
visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
|
||||
rune_in_use = TRUE
|
||||
@@ -238,8 +238,8 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/imbue/proc/checkpapers()
|
||||
. = list()
|
||||
for(var/obj/item/weapon/paper/P in get_turf(src))
|
||||
if(!P.info && !istype(P, /obj/item/weapon/paper/talisman))
|
||||
for(var/obj/item/paper/P in get_turf(src))
|
||||
if(!P.info && !istype(P, /obj/item/paper/talisman))
|
||||
. |= P
|
||||
|
||||
/obj/effect/rune/teleport
|
||||
@@ -388,7 +388,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
[brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
|
||||
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
|
||||
SSticker.mode.add_cultist(convertee.mind, 1)
|
||||
new /obj/item/weapon/tome(get_turf(src))
|
||||
new /obj/item/tome(get_turf(src))
|
||||
convertee.mind.special_role = "Cultist"
|
||||
to_chat(convertee, "<span class='cultitalic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
|
||||
and something evil takes root.</b></span>")
|
||||
@@ -476,7 +476,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
//BEGIN THE SUMMONING
|
||||
used = TRUE
|
||||
..()
|
||||
send_to_playing_players('sound/effects/dimensional_rend.ogg')
|
||||
sound_to_playing_players('sound/effects/dimensional_rend.ogg')
|
||||
var/turf/T = get_turf(src)
|
||||
sleep(40)
|
||||
if(src)
|
||||
@@ -485,14 +485,14 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
|
||||
if((istype(I, /obj/item/tome) && iscultist(user)))
|
||||
user.visible_message("<span class='warning'>[user.name] begins erasing the [src]...</span>", "<span class='notice'>You begin erasing the [src]...</span>")
|
||||
if(do_after(user, 50, target = src)) //Prevents accidental erasures.
|
||||
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
|
||||
message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
|
||||
..()
|
||||
else
|
||||
if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
|
||||
if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
|
||||
log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
|
||||
message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
|
||||
..()
|
||||
@@ -842,7 +842,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
var/obj/item/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
|
||||
continue
|
||||
@@ -871,7 +871,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
set_light(6, 1, color)
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(!iscultist(L) && L.blood_volume)
|
||||
var/obj/item/weapon/nullrod/N = L.null_rod_check()
|
||||
var/obj/item/nullrod/N = L.null_rod_check()
|
||||
if(N)
|
||||
continue
|
||||
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
|
||||
@@ -913,7 +913,7 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/list/ghosts_on_rune = list()
|
||||
for(var/mob/dead/observer/O in get_turf(src))
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
|
||||
ghosts_on_rune |= O
|
||||
ghosts_on_rune += O
|
||||
if(!ghosts_on_rune.len)
|
||||
to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
|
||||
fail_invoke()
|
||||
@@ -926,9 +926,9 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
var/list/ghosts_on_rune = list()
|
||||
for(var/mob/dead/observer/O in get_turf(src))
|
||||
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
|
||||
ghosts_on_rune |= O
|
||||
ghosts_on_rune += O
|
||||
var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
|
||||
var/mob/living/carbon/human/new_human = new(get_turf(src))
|
||||
var/mob/living/carbon/human/cult_ghost/new_human = new(get_turf(src))
|
||||
new_human.real_name = ghost_to_spawn.real_name
|
||||
new_human.alpha = 150 //Makes them translucent
|
||||
new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor
|
||||
@@ -959,3 +959,12 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
for(var/obj/I in new_human)
|
||||
new_human.dropItemToGround(I, TRUE)
|
||||
new_human.dust()
|
||||
|
||||
/mob/living/carbon/human/cult_ghost/spill_organs(no_brain, no_organs, no_bodyparts) //cult ghosts never drop a brain
|
||||
no_brain = TRUE
|
||||
. = ..()
|
||||
|
||||
/mob/living/carbon/human/cult_ghost/getorganszone(zone, subzones = 0)
|
||||
. = ..()
|
||||
for(var/obj/item/organ/brain/B in .) //they're not that smart, really
|
||||
. -= B
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
//Supply Talisman: Has a few unique effects. Granted only to starter cultists.
|
||||
/obj/item/weapon/paper/talisman/supply
|
||||
/obj/item/paper/talisman/supply
|
||||
cultist_name = "Supply Talisman"
|
||||
cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on."
|
||||
invocation = null
|
||||
@@ -15,7 +15,7 @@
|
||||
/datum/cult_supply/construct_shell
|
||||
)
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/dat = list()
|
||||
dat += "<B>There are [uses] bloody runes on the parchment.</B><BR>"
|
||||
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
|
||||
@@ -28,7 +28,7 @@
|
||||
popup.open()
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
|
||||
/obj/item/paper/talisman/supply/Topic(href, href_list)
|
||||
if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr))
|
||||
return
|
||||
|
||||
@@ -58,11 +58,11 @@
|
||||
to_chat(usr, "<span class='warning'>[src] crumbles to dust.</span>")
|
||||
burn()
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak
|
||||
/obj/item/paper/talisman/supply/weak
|
||||
cultist_name = "Lesser Supply Talisman"
|
||||
uses = 2
|
||||
|
||||
/obj/item/weapon/paper/talisman/supply/weak/Initialize(mapload)
|
||||
/obj/item/paper/talisman/supply/weak/Initialize(mapload)
|
||||
. = ..()
|
||||
// no runed metal from lesser talismans.
|
||||
possible_summons -= /datum/cult_supply/metal
|
||||
@@ -77,7 +77,7 @@
|
||||
id = "arcane_tome"
|
||||
invocation = "N'ath reth sh'yro eth d'raggathnor!"
|
||||
desc = "Summons an arcane tome, used to scribe runes."
|
||||
summon_type = /obj/item/weapon/tome
|
||||
summon_type = /obj/item/tome
|
||||
|
||||
/datum/cult_supply/metal
|
||||
id = "runed_metal"
|
||||
@@ -89,25 +89,25 @@
|
||||
id = "teleport_talisman"
|
||||
invocation = "Sas'so c'arta forbici!"
|
||||
desc = "Allows you to move to a selected teleportation rune."
|
||||
summon_type = /obj/item/weapon/paper/talisman/teleport
|
||||
summon_type = /obj/item/paper/talisman/teleport
|
||||
|
||||
/datum/cult_supply/talisman/emp
|
||||
id = "emp_talisman"
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
desc = "Allows you to destroy technology in a short range."
|
||||
summon_type = /obj/item/weapon/paper/talisman/emp
|
||||
summon_type = /obj/item/paper/talisman/emp
|
||||
|
||||
/datum/cult_supply/talisman/stun
|
||||
id = "stun_talisman"
|
||||
invocation = "Fuu ma'jin!"
|
||||
desc = "Allows you to stun a person by attacking them with the talisman. Does not work on people holding a holy weapon!"
|
||||
summon_type = /obj/item/weapon/paper/talisman/stun
|
||||
summon_type = /obj/item/paper/talisman/stun
|
||||
|
||||
/datum/cult_supply/talisman/veil
|
||||
id = "veil_talisman"
|
||||
invocation = "Kla'atu barada nikt'o!"
|
||||
desc = "Two use talisman, first use makes all nearby runes invisible, secnd use reveals nearby hidden runes."
|
||||
summon_type = /obj/item/weapon/paper/talisman/true_sight
|
||||
summon_type = /obj/item/paper/talisman/true_sight
|
||||
|
||||
/datum/cult_supply/soulstone
|
||||
id = "soulstone"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/weapon/paper/talisman
|
||||
/obj/item/paper/talisman
|
||||
var/cultist_name = "talisman"
|
||||
var/cultist_desc = "A basic talisman. It serves no purpose."
|
||||
var/invocation = "Naise meam!"
|
||||
@@ -6,7 +6,7 @@
|
||||
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
|
||||
var/creation_time = 100 //how long it takes an imbue rune to make this type of talisman
|
||||
|
||||
/obj/item/weapon/paper/talisman/examine(mob/user)
|
||||
/obj/item/paper/talisman/examine(mob/user)
|
||||
if(iscultist(user) || user.stat == DEAD)
|
||||
to_chat(user, "<b>Name:</b> [cultist_name]")
|
||||
to_chat(user, "<b>Effect:</b> [cultist_desc]")
|
||||
@@ -14,7 +14,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/attack_self(mob/living/user)
|
||||
/obj/item/paper/talisman/attack_self(mob/living/user)
|
||||
if(!iscultist(user))
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return
|
||||
@@ -24,7 +24,7 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
. = successfuluse
|
||||
if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff
|
||||
if(invocation)
|
||||
@@ -34,19 +34,19 @@
|
||||
C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm"))
|
||||
|
||||
//Malformed Talisman: If something goes wrong.
|
||||
/obj/item/weapon/paper/talisman/malformed
|
||||
/obj/item/paper/talisman/malformed
|
||||
cultist_name = "malformed talisman"
|
||||
cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this."
|
||||
invocation = "Ra'sha yoka!"
|
||||
|
||||
/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1)
|
||||
to_chat(user, "<span class='cultitalic'>You feel a pain in your head. The Geometer is displeased.</span>")
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.apply_damage(10, BRUTE, "head")
|
||||
|
||||
//Rite of Translocation: Same as rune
|
||||
/obj/item/weapon/paper/talisman/teleport
|
||||
/obj/item/paper/talisman/teleport
|
||||
cultist_name = "Talisman of Teleportation"
|
||||
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
|
||||
color = RUNE_COLOR_TELEPORT
|
||||
@@ -54,7 +54,7 @@
|
||||
health_cost = 5
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1)
|
||||
var/list/potential_runes = list()
|
||||
var/list/teleportnames = list()
|
||||
for(var/R in GLOB.teleport_runes)
|
||||
@@ -86,7 +86,7 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome
|
||||
/obj/item/paper/talisman/summon_tome
|
||||
cultist_name = "Talisman of Tome Summoning"
|
||||
cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of the Geometer."
|
||||
color = "#512727" // red-black
|
||||
@@ -94,15 +94,15 @@
|
||||
health_cost = 1
|
||||
creation_time = 30
|
||||
|
||||
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand glows red for a moment.</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman!</span>")
|
||||
new /obj/item/weapon/tome(get_turf(user))
|
||||
new /obj/item/tome(get_turf(user))
|
||||
user.visible_message("<span class='warning'>A tome appears at [user]'s feet!</span>", \
|
||||
"<span class='cultitalic'>An arcane tome materializes at your feet.</span>")
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight
|
||||
/obj/item/paper/talisman/true_sight
|
||||
cultist_name = "Talisman of Veiling"
|
||||
cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes."
|
||||
color = "#9c9c9c" // grey
|
||||
@@ -112,7 +112,7 @@
|
||||
uses = 6
|
||||
var/revealing = FALSE //if it reveals or not
|
||||
|
||||
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
if(!revealing)
|
||||
user.visible_message("<span class='warning'>Thin grey dust falls from [user]'s hand!</span>", \
|
||||
@@ -128,14 +128,14 @@
|
||||
R.talismanreveal()
|
||||
|
||||
//Rite of Disruption: Weaker than rune
|
||||
/obj/item/weapon/paper/talisman/emp
|
||||
/obj/item/paper/talisman/emp
|
||||
cultist_name = "Talisman of Electromagnetic Pulse"
|
||||
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
|
||||
color = "#4d94ff" // light blue
|
||||
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||
health_cost = 5
|
||||
|
||||
/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>[user]'s hand flashes a bright blue!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
|
||||
@@ -143,14 +143,14 @@
|
||||
|
||||
|
||||
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
|
||||
/obj/item/weapon/paper/talisman/stun
|
||||
/obj/item/paper/talisman/stun
|
||||
cultist_name = "Talisman of Stunning"
|
||||
cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
|
||||
color = "#ff0000" // red
|
||||
invocation = "Fuu ma'jin!"
|
||||
health_cost = 10
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
|
||||
/obj/item/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
@@ -159,12 +159,12 @@
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1)
|
||||
if(iscultist(user))
|
||||
invoke(user, 1)
|
||||
user.visible_message("<span class='warning'>[user] holds up [src], which explodes in a flash of red light!</span>", \
|
||||
"<span class='cultitalic'>You stun [target] with the talisman!</span>")
|
||||
var/obj/item/weapon/nullrod/N = locate() in target
|
||||
var/obj/item/nullrod/N = locate() in target
|
||||
if(N)
|
||||
target.visible_message("<span class='warning'>[target]'s holy weapon absorbs the talisman's light!</span>", \
|
||||
"<span class='userdanger'>Your holy weapon absorbs the blinding light!</span>")
|
||||
@@ -189,26 +189,26 @@
|
||||
|
||||
|
||||
//Rite of Arming: Equips cultist armor on the user, where available
|
||||
/obj/item/weapon/paper/talisman/armor
|
||||
/obj/item/paper/talisman/armor
|
||||
cultist_name = "Talisman of Arming"
|
||||
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
|
||||
color = "#33cc33" // green
|
||||
invocation = "N'ath reth sh'yro eth draggathnor!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
/obj/item/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1)
|
||||
. = ..()
|
||||
user.visible_message("<span class='warning'>Otherworldly armor suddenly appears on [user]!</span>", \
|
||||
"<span class='cultitalic'>You speak the words of the talisman, arming yourself!</span>")
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
|
||||
user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
|
||||
user.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
|
||||
user.drop_item()
|
||||
user.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
|
||||
user.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user))
|
||||
user.put_in_hands(new /obj/item/melee/cultblade(user))
|
||||
user.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
|
||||
|
||||
/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
/obj/item/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && iscultist(target))
|
||||
user.drop_item()
|
||||
invoke(target)
|
||||
@@ -218,14 +218,14 @@
|
||||
|
||||
|
||||
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
|
||||
/obj/item/weapon/paper/talisman/horror
|
||||
/obj/item/paper/talisman/horror
|
||||
cultist_name = "Talisman of Horrors"
|
||||
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
|
||||
color = "#ffb366" // light orange
|
||||
invocation = "Lo'Nab Na'Dm!"
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
|
||||
/obj/item/paper/talisman/horror/afterattack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && (get_dist(user, target) < 7))
|
||||
to_chat(user, "<span class='cultitalic'>You disturb [target] with visions of madness!</span>")
|
||||
if(iscarbon(target))
|
||||
@@ -240,7 +240,7 @@
|
||||
|
||||
|
||||
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets, or converts plasteel into runed metal up to 25 times
|
||||
/obj/item/weapon/paper/talisman/construction
|
||||
/obj/item/paper/talisman/construction
|
||||
cultist_name = "Talisman of Construction"
|
||||
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell"
|
||||
invocation = "Ethra p'ni dedol!"
|
||||
@@ -248,21 +248,21 @@
|
||||
uses = 25
|
||||
creation_time = 80
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
|
||||
/obj/item/paper/talisman/construction/attack_self(mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='warning'>To use this talisman, place it upon a stack of metal sheets.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
/obj/item/paper/talisman/construction/attack(obj/M,mob/living/user)
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cultitalic'>This talisman will only work on a stack of metal or plasteel sheets!</span>")
|
||||
log_game("Construct talisman failed - not a valid target")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
/obj/item/paper/talisman/construction/afterattack(obj/item/stack/sheet/target, mob/user, proximity_flag, click_parameters)
|
||||
..()
|
||||
if(proximity_flag && iscultist(user))
|
||||
var/turf/T = get_turf(target)
|
||||
@@ -290,14 +290,14 @@
|
||||
|
||||
|
||||
//Talisman of Shackling: Applies special cuffs directly from the talisman
|
||||
/obj/item/weapon/paper/talisman/shackle
|
||||
/obj/item/paper/talisman/shackle
|
||||
cultist_name = "Talisman of Shackling"
|
||||
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
|
||||
invocation = "In'totum Lig'abis!"
|
||||
color = "#B27300" // burnt-orange
|
||||
uses = 6
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
|
||||
/obj/item/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0)
|
||||
if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff
|
||||
return ..()
|
||||
if(iscultist(user))
|
||||
@@ -306,7 +306,7 @@
|
||||
to_chat(user, "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>")
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
/obj/item/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
|
||||
if(iscultist(user) && istype(target))
|
||||
if(target.stat == DEAD)
|
||||
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
|
||||
@@ -315,7 +315,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
|
||||
/obj/item/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
|
||||
if(!C.handcuffed)
|
||||
invoke(user, 1)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
@@ -323,7 +323,7 @@
|
||||
"<span class='userdanger'>[user] begins shaping a dark magic around your wrists!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You shackle [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
@@ -338,14 +338,14 @@
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
/obj/item/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
name = "cult shackles"
|
||||
desc = "Shackles that bind the wrists with sinister magic."
|
||||
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
|
||||
trashtype = /obj/item/restraints/handcuffs/energy/used
|
||||
origin_tech = "materials=2;magnets=5"
|
||||
flags = DROPDEL
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s shackles shatter in a discharge of dark magic!</span>", \
|
||||
"<span class='userdanger'>Your [src] shatters in a discharge of dark magic!</span>")
|
||||
. = ..()
|
||||
|
||||
@@ -26,11 +26,11 @@
|
||||
src.visible_message("<span class='warning'>[src] seems to have been harmed by the purity of [attacker]'s clothes.</span>", "<span class='notice'>Unsullied white clothing is disrupting your form.</span>")
|
||||
return whiteness[U.type] + 1
|
||||
if(BANE_TOOLBOX)
|
||||
if(istype(weapon, /obj/item/weapon/storage/toolbox))
|
||||
if(istype(weapon, /obj/item/storage/toolbox))
|
||||
src.visible_message("<span class='warning'>The [weapon] seems unusually robust this time.</span>", "<span class='notice'>The [weapon] is your unmaking!</span>")
|
||||
return 2.5 // Will take four hits with a normal toolbox to crit.
|
||||
if(BANE_HARVEST)
|
||||
if(istype(weapon, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/))
|
||||
visible_message("<span class='warning'>The spirits of the harvest aid in the exorcism.</span>", "<span class='notice'>The harvest spirits are harming you.</span>")
|
||||
Knockdown(40)
|
||||
qdel(weapon)
|
||||
|
||||
@@ -444,8 +444,8 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master",
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
|
||||
H.equip_to_slot_or_del(new /obj/item/storage/briefcase(H), slot_hands)
|
||||
H.equip_to_slot_or_del(new /obj/item/pen(H), slot_l_store)
|
||||
if(SOULVALUE >= BLOOD_THRESHOLD)
|
||||
H.set_species(/datum/species/lizard, 1)
|
||||
H.underwear = "Nude"
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
//Left hand items
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.flags & ABSTRACT))
|
||||
if(!(I.flags_1 & ABSTRACT_1))
|
||||
if(I.blood_DNA)
|
||||
msg += "<span class='warning'>It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!</span>\n"
|
||||
else
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
var/probability = 0
|
||||
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
|
||||
var/explosion_in_progress = 0 //sit back and relax
|
||||
var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such
|
||||
var/round_ends_with_antag_death = 0 //flags_1 the "one verse the station" antags as such
|
||||
var/list/datum/mind/modePlayer = new
|
||||
var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here
|
||||
var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
if(SSdbcore.Connect())
|
||||
var/sql
|
||||
if(SSticker.mode)
|
||||
if(SSticker.mode)
|
||||
sql += "game_mode = '[SSticker.mode]'"
|
||||
if(GLOB.revdata.originmastercommit)
|
||||
if(sql)
|
||||
@@ -111,7 +111,7 @@
|
||||
var/list/living_crew = list()
|
||||
|
||||
for(var/mob/Player in GLOB.mob_list)
|
||||
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client)
|
||||
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client)
|
||||
living_crew += Player
|
||||
if(living_crew.len / GLOB.joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
|
||||
message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
|
||||
@@ -120,7 +120,7 @@
|
||||
var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len)
|
||||
var/list/datum/game_mode/usable_modes = list()
|
||||
for(var/datum/game_mode/G in runnable_modes)
|
||||
if(G.reroll_friendly && living_crew >= G.required_players)
|
||||
if(G.reroll_friendly && living_crew >= G.required_players)
|
||||
usable_modes += G
|
||||
else
|
||||
qdel(G)
|
||||
@@ -208,7 +208,7 @@
|
||||
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
|
||||
|
||||
for(var/mob/Player in GLOB.living_mob_list)
|
||||
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client)
|
||||
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client)
|
||||
if(Player.mind.special_role) //Someone's still antaging!
|
||||
living_antag_player = Player
|
||||
return 0
|
||||
@@ -369,7 +369,7 @@
|
||||
if(candidates.len < recommended_enemies)
|
||||
for(var/mob/dead/new_player/player in players)
|
||||
if(player.client && player.ready == PLAYER_READY_TO_PLAY)
|
||||
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
|
||||
if(!(role in player.client.prefs.be_special)) // We don't have enough people who want to be antagonist, make a separate list of people who don't want to be one
|
||||
if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, role)) //Nodrak/Carn: Antag Job-bans
|
||||
drafted += player.mind
|
||||
|
||||
|
||||
@@ -126,11 +126,11 @@
|
||||
icon_state = "dominator-broken"
|
||||
|
||||
/obj/machinery/dominator/obj_break(damage_flag)
|
||||
if(!(stat & BROKEN) && !(flags & NODECONSTRUCT))
|
||||
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
|
||||
set_broken()
|
||||
|
||||
/obj/machinery/dominator/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!(stat & BROKEN))
|
||||
set_broken()
|
||||
new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
|
||||
@@ -117,7 +117,7 @@ GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
var/obj/item/device/gangtool/gangtool = new(mob)
|
||||
var/obj/item/weapon/pen/gang/T = new(mob)
|
||||
var/obj/item/pen/gang/T = new(mob)
|
||||
var/obj/item/toy/crayon/spraycan/gang/SC = new(mob,gang)
|
||||
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob,gang)
|
||||
|
||||
|
||||
@@ -174,16 +174,16 @@
|
||||
name = "Badass Belt"
|
||||
id = "belt"
|
||||
cost = 13
|
||||
item_path = /obj/item/weapon/storage/belt/military/gang
|
||||
item_path = /obj/item/storage/belt/military/gang
|
||||
|
||||
/obj/item/weapon/storage/belt/military/gang
|
||||
/obj/item/storage/belt/military/gang
|
||||
name = "badass belt"
|
||||
icon_state = "gangbelt"
|
||||
item_state = "gang"
|
||||
desc = "The belt buckle simply reads 'BAMF'."
|
||||
storage_slots = 1
|
||||
|
||||
/obj/item/weapon/storage/belt/military/gang/gang_contraband_value()
|
||||
/obj/item/storage/belt/military/gang/gang_contraband_value()
|
||||
return 4
|
||||
|
||||
///////////////////
|
||||
@@ -202,19 +202,19 @@
|
||||
name = "Shuriken"
|
||||
id = "shuriken"
|
||||
cost = 3
|
||||
item_path = /obj/item/weapon/throwing_star
|
||||
item_path = /obj/item/throwing_star
|
||||
|
||||
/datum/gang_item/weapon/switchblade
|
||||
name = "Switchblade"
|
||||
id = "switchblade"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/switchblade
|
||||
item_path = /obj/item/switchblade
|
||||
|
||||
/datum/gang_item/weapon/surplus
|
||||
name = "Surplus Rifle"
|
||||
id = "surplus"
|
||||
cost = 8
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/surplus
|
||||
item_path = /obj/item/gun/ballistic/automatic/surplus
|
||||
|
||||
/datum/gang_item/weapon/ammo/surplus_ammo
|
||||
name = "Surplus Rifle Ammo"
|
||||
@@ -226,19 +226,19 @@
|
||||
name = "Sawn-Off Improvised Shotgun"
|
||||
id = "sawn"
|
||||
cost = 6
|
||||
item_path = /obj/item/weapon/gun/ballistic/revolver/doublebarrel/improvised/sawn
|
||||
item_path = /obj/item/gun/ballistic/revolver/doublebarrel/improvised/sawn
|
||||
|
||||
/datum/gang_item/weapon/ammo/improvised_ammo
|
||||
name = "Box of Buckshot"
|
||||
id = "buckshot"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/storage/box/lethalshot
|
||||
item_path = /obj/item/storage/box/lethalshot
|
||||
|
||||
/datum/gang_item/weapon/pistol
|
||||
name = "10mm Pistol"
|
||||
id = "pistol"
|
||||
cost = 30
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/pistol
|
||||
item_path = /obj/item/gun/ballistic/automatic/pistol
|
||||
|
||||
/datum/gang_item/weapon/ammo/pistol_ammo
|
||||
name = "10mm Ammo"
|
||||
@@ -250,7 +250,7 @@
|
||||
name = "Black Market .50cal Sniper Rifle"
|
||||
id = "sniper"
|
||||
cost = 40
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang
|
||||
item_path = /obj/item/gun/ballistic/automatic/sniper_rifle/gang
|
||||
|
||||
/datum/gang_item/weapon/ammo/sniper_ammo
|
||||
name = "Smuggled .50cal Sniper Rounds"
|
||||
@@ -277,7 +277,7 @@
|
||||
name = "Uzi SMG"
|
||||
id = "uzi"
|
||||
cost = 60
|
||||
item_path = /obj/item/weapon/gun/ballistic/automatic/mini_uzi
|
||||
item_path = /obj/item/gun/ballistic/automatic/mini_uzi
|
||||
|
||||
|
||||
/datum/gang_item/weapon/ammo/uzi_ammo
|
||||
@@ -304,38 +304,38 @@
|
||||
name = "Sharpener"
|
||||
id = "whetstone"
|
||||
cost = 3
|
||||
item_path = /obj/item/weapon/sharpener
|
||||
item_path = /obj/item/sharpener
|
||||
|
||||
|
||||
/datum/gang_item/equipment/emp
|
||||
name = "EMP Grenade"
|
||||
id = "EMP"
|
||||
cost = 5
|
||||
item_path = /obj/item/weapon/grenade/empgrenade
|
||||
item_path = /obj/item/grenade/empgrenade
|
||||
|
||||
/datum/gang_item/equipment/c4
|
||||
name = "C4 Explosive"
|
||||
id = "c4"
|
||||
cost = 7
|
||||
item_path = /obj/item/weapon/grenade/plastic/c4
|
||||
item_path = /obj/item/grenade/plastic/c4
|
||||
|
||||
/datum/gang_item/equipment/frag
|
||||
name = "Fragmentation Grenade"
|
||||
id = "frag nade"
|
||||
cost = 18
|
||||
item_path = /obj/item/weapon/grenade/syndieminibomb/concussion/frag
|
||||
item_path = /obj/item/grenade/syndieminibomb/concussion/frag
|
||||
|
||||
/datum/gang_item/equipment/stimpack
|
||||
name = "Black Market Stimulants"
|
||||
id = "stimpack"
|
||||
cost = 12
|
||||
item_path = /obj/item/weapon/reagent_containers/syringe/stimulants
|
||||
item_path = /obj/item/reagent_containers/syringe/stimulants
|
||||
|
||||
/datum/gang_item/equipment/implant_breaker
|
||||
name = "Implant Breaker"
|
||||
id = "implant_breaker"
|
||||
cost = 10
|
||||
item_path = /obj/item/weapon/implanter/gang
|
||||
item_path = /obj/item/implanter/gang
|
||||
spawn_msg = "<span class='notice'>The <b>implant breaker</b> is a single-use device that destroys all implants within the target before trying to recruit them to your gang. Also works on enemy gangsters.</span>"
|
||||
|
||||
/datum/gang_item/equipment/implant_breaker/spawn_item(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
@@ -355,13 +355,13 @@
|
||||
name = "Wetwork boots"
|
||||
desc = "A gang's best hitmen are prepared for anything."
|
||||
permeability_coefficient = 0.01
|
||||
flags = NOSLIP
|
||||
flags_1 = NOSLIP_1
|
||||
|
||||
/datum/gang_item/equipment/pen
|
||||
name = "Recruitment Pen"
|
||||
id = "pen"
|
||||
cost = 50
|
||||
item_path = /obj/item/weapon/pen/gang
|
||||
item_path = /obj/item/pen/gang
|
||||
spawn_msg = "<span class='notice'>More <b>recruitment pens</b> will allow you to recruit gangsters faster. Only gang leaders can recruit with pens.</span>"
|
||||
|
||||
/datum/gang_item/equipment/pen/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
@@ -431,7 +431,7 @@
|
||||
/datum/gang_item/equipment/dominator/purchase(mob/living/carbon/user, datum/gang/gang, obj/item/device/gangtool/gangtool)
|
||||
var/area/usrarea = get_area(user.loc)
|
||||
var/usrturf = get_turf(user.loc)
|
||||
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION)
|
||||
if(initial(usrarea.name) == "Space" || isspaceturf(usrturf) || usr.z != ZLEVEL_STATION || !usrarea.valid_territory)
|
||||
to_chat(user, "<span class='warning'>You can only use this on the station!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/*
|
||||
* Gang Boss Pens
|
||||
*/
|
||||
/obj/item/weapon/pen/gang
|
||||
/obj/item/pen/gang
|
||||
origin_tech = "materials=2;syndicate=3"
|
||||
var/cooldown
|
||||
var/last_used = 0
|
||||
var/charges = 1
|
||||
|
||||
/obj/item/weapon/pen/gang/New()
|
||||
/obj/item/pen/gang/New()
|
||||
..()
|
||||
last_used = world.time
|
||||
|
||||
/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
|
||||
/obj/item/pen/gang/attack(mob/living/M, mob/user, stealth = TRUE)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(ishuman(M) && ishuman(user) && M.stat != DEAD)
|
||||
@@ -44,7 +44,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/pen/gang/proc/cooldown(datum/gang/gang)
|
||||
/obj/item/pen/gang/proc/cooldown(datum/gang/gang)
|
||||
set waitfor = FALSE
|
||||
var/cooldown_time = 600+(600*gang.bosses.len) // 1recruiter=2mins, 2recruiters=3mins, 3recruiters=4mins
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
flags = CONDUCT
|
||||
flags_1 = CONDUCT_1
|
||||
origin_tech = "programming=5;bluespace=2;syndicate=5"
|
||||
var/datum/gang/gang //Which gang uses this?
|
||||
var/recalling = 0
|
||||
|
||||
@@ -310,7 +310,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
owner_AI.doomsday_device = DOOM
|
||||
owner_AI.doomsday_device.start()
|
||||
for(var/pinpointer in GLOB.pinpointer_list)
|
||||
var/obj/item/weapon/pinpointer/P = pinpointer
|
||||
var/obj/item/pinpointer/P = pinpointer
|
||||
P.switch_mode_to(TRACK_MALF_AI) //Pinpointers start tracking the AI wherever it goes
|
||||
qdel(src)
|
||||
|
||||
@@ -462,8 +462,8 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
|
||||
/datum/action/innate/ai/destroy_rcds/Activate()
|
||||
for(var/I in GLOB.rcd_list)
|
||||
if(!istype(I, /obj/item/weapon/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
|
||||
var/obj/item/weapon/construction/rcd/RCD = I
|
||||
if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared.
|
||||
var/obj/item/construction/rcd/RCD = I
|
||||
RCD.detonate_pulse()
|
||||
to_chat(owner, "<span class='danger'>RCD detonation pulse emitted.</span>")
|
||||
owner.playsound_local(owner, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
|
||||
@@ -100,7 +100,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
var/threat = 0 // used for determining which meteors are most interesting
|
||||
var/lifetime = DEFAULT_METEOR_LIFETIME
|
||||
|
||||
var/list/meteordrop = list(/obj/item/weapon/ore/iron)
|
||||
var/list/meteordrop = list(/obj/item/ore/iron)
|
||||
var/dropamt = 2
|
||||
|
||||
/obj/effect/meteor/Move()
|
||||
@@ -170,8 +170,8 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
|
||||
#undef METEOR_MEDAL
|
||||
|
||||
/obj/effect/meteor/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/pickaxe))
|
||||
/obj/effect/meteor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/pickaxe))
|
||||
make_debris()
|
||||
qdel(src)
|
||||
else
|
||||
@@ -209,7 +209,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 1
|
||||
hitpwr = 3
|
||||
meteorsound = 'sound/weapons/gunshot_smg.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/glass)
|
||||
meteordrop = list(/obj/item/ore/glass)
|
||||
threat = 1
|
||||
|
||||
//Medium-sized
|
||||
@@ -242,7 +242,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 5
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/bamf.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/plasma)
|
||||
meteordrop = list(/obj/item/ore/plasma)
|
||||
threat = 20
|
||||
|
||||
/obj/effect/meteor/flaming/meteor_effect()
|
||||
@@ -254,7 +254,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
name = "glowing meteor"
|
||||
icon_state = "glowing"
|
||||
heavy = 1
|
||||
meteordrop = list(/obj/item/weapon/ore/uranium)
|
||||
meteordrop = list(/obj/item/ore/uranium)
|
||||
threat = 15
|
||||
|
||||
|
||||
@@ -272,13 +272,13 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hits = 2
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/blobattack.ogg'
|
||||
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human, /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
|
||||
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/human, /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant, /obj/item/organ/heart, /obj/item/organ/lungs, /obj/item/organ/tongue, /obj/item/organ/appendix/)
|
||||
var/meteorgibs = /obj/effect/gibspawner/generic
|
||||
threat = 2
|
||||
|
||||
/obj/effect/meteor/meaty/New()
|
||||
for(var/path in meteordrop)
|
||||
if(path == /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant)
|
||||
if(path == /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant)
|
||||
meteordrop -= path
|
||||
meteordrop += pick(subtypesof(path))
|
||||
|
||||
@@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
//Meaty Ore Xeno edition
|
||||
/obj/effect/meteor/meaty/xeno
|
||||
color = "#5EFF00"
|
||||
meteordrop = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
|
||||
meteordrop = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno, /obj/item/organ/tongue/alien)
|
||||
meteorgibs = /obj/effect/gibspawner/xeno
|
||||
|
||||
/obj/effect/meteor/meaty/xeno/New()
|
||||
@@ -324,7 +324,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
hitpwr = 1
|
||||
heavy = 1
|
||||
meteorsound = 'sound/effects/bamf.ogg'
|
||||
meteordrop = list(/obj/item/weapon/ore/plasma)
|
||||
meteordrop = list(/obj/item/ore/plasma)
|
||||
threat = 50
|
||||
|
||||
/obj/effect/meteor/tunguska/Move()
|
||||
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(meteorsSPOOKY, list(/obj/effect/meteor/pumpkin))
|
||||
hits = 10
|
||||
heavy = 1
|
||||
dropamt = 1
|
||||
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin)
|
||||
meteordrop = list(/obj/item/clothing/head/hardhat/pumpkinhead, /obj/item/reagent_containers/food/snacks/grown/pumpkin)
|
||||
threat = 100
|
||||
|
||||
/obj/effect/meteor/pumpkin/New()
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
allowed = list(
|
||||
/obj/item/device/abductor,
|
||||
/obj/item/weapon/abductor_baton,
|
||||
/obj/item/weapon/melee/baton,
|
||||
/obj/item/weapon/gun/energy,
|
||||
/obj/item/weapon/restraints/handcuffs
|
||||
/obj/item/abductor_baton,
|
||||
/obj/item/melee/baton,
|
||||
/obj/item/gun/energy,
|
||||
/obj/item/restraints/handcuffs
|
||||
)
|
||||
var/mode = VEST_STEALTH
|
||||
var/stealth_active = 0
|
||||
@@ -29,9 +29,9 @@
|
||||
var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50, fire = 90, acid = 90)
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
|
||||
flags ^= NODROP
|
||||
flags_1 ^= NODROP_1
|
||||
if(ismob(loc))
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [flags & NODROP ? "locked" : "unlocked"].</span>")
|
||||
to_chat(loc, "<span class='notice'>Your vest is now [flags_1 & NODROP_1 ? "locked" : "unlocked"].</span>")
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
|
||||
switch(mode)
|
||||
@@ -292,7 +292,7 @@
|
||||
/obj/item/device/firing_pin/abductor/pin_auth(mob/living/user)
|
||||
. = isabductor(user)
|
||||
|
||||
/obj/item/weapon/gun/energy/alien
|
||||
/obj/item/gun/energy/alien
|
||||
name = "alien pistol"
|
||||
desc = "A complicated gun that fires bursts of high-intensity radiation."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/declone)
|
||||
@@ -302,7 +302,7 @@
|
||||
origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
|
||||
|
||||
/obj/item/weapon/paper/guides/antag/abductor
|
||||
/obj/item/paper/guides/antag/abductor
|
||||
name = "Dissection Guide"
|
||||
icon_state = "alienpaper_words"
|
||||
info = {"<b>Dissection for Dummies</b><br>
|
||||
@@ -324,10 +324,10 @@
|
||||
<br>
|
||||
Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
|
||||
/obj/item/weapon/paper/guides/antag/abductor/update_icon()
|
||||
/obj/item/paper/guides/antag/abductor/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/guides/antag/abductor/AltClick()
|
||||
/obj/item/paper/guides/antag/abductor/AltClick()
|
||||
return
|
||||
|
||||
#define BATON_STUN 0
|
||||
@@ -336,7 +336,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
#define BATON_PROBE 3
|
||||
#define BATON_MODES 4
|
||||
|
||||
/obj/item/weapon/abductor_baton
|
||||
/obj/item/abductor_baton
|
||||
name = "advanced baton"
|
||||
desc = "A quad-mode baton used for incapacitation and restraining of specimens."
|
||||
var/mode = BATON_STUN
|
||||
@@ -351,7 +351,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_mode)
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr)
|
||||
/obj/item/abductor_baton/proc/toggle(mob/living/user=usr)
|
||||
mode = (mode+1)%BATON_MODES
|
||||
var/txt
|
||||
switch(mode)
|
||||
@@ -367,7 +367,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
to_chat(usr, "<span class='notice'>You switch the baton to [txt] mode.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/abductor_baton/update_icon()
|
||||
/obj/item/abductor_baton/update_icon()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
icon_state = "wonderprodStun"
|
||||
@@ -382,7 +382,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
icon_state = "wonderprodProbe"
|
||||
item_state = "wonderprodProbe"
|
||||
|
||||
/obj/item/weapon/abductor_baton/attack(mob/target, mob/living/user)
|
||||
/obj/item/abductor_baton/attack(mob/target, mob/living/user)
|
||||
if(!isabductor(user))
|
||||
return
|
||||
|
||||
@@ -413,10 +413,10 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
if(BATON_PROBE)
|
||||
ProbeAttack(L,user)
|
||||
|
||||
/obj/item/weapon/abductor_baton/attack_self(mob/living/user)
|
||||
/obj/item/abductor_baton/attack_self(mob/living/user)
|
||||
toggle(user)
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
user.lastattacked = L
|
||||
L.lastattacker = user
|
||||
|
||||
@@ -433,7 +433,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
|
||||
add_logs(user, L, "stunned")
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
if(L.incapacitated(TRUE, TRUE))
|
||||
L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel very drowsy!</span>")
|
||||
@@ -446,7 +446,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel drowsy!</span>")
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
if(!iscarbon(L))
|
||||
return
|
||||
var/mob/living/carbon/C = L
|
||||
@@ -457,7 +457,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
"<span class='userdanger'>[user] begins shaping an energy field around your hands!</span>")
|
||||
if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore()))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(C)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/energy/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You restrain [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
@@ -466,7 +466,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/weapon/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
L.visible_message("<span class='danger'>[user] probes [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] probes you!</span>")
|
||||
|
||||
@@ -487,21 +487,21 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
to_chat(user, "<span class='notice'>Probing result:</span>[species]")
|
||||
to_chat(user, "[helptext]")
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy
|
||||
/obj/item/restraints/handcuffs/energy
|
||||
name = "hard-light energy field"
|
||||
desc = "A hard-light field restraining the hands."
|
||||
icon_state = "cuff_white" // Needs sprite
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
breakouttime = 450
|
||||
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
|
||||
trashtype = /obj/item/restraints/handcuffs/energy/used
|
||||
origin_tech = "materials=4;magnets=5;abductor=2"
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/used
|
||||
/obj/item/restraints/handcuffs/energy/used
|
||||
desc = "energy discharge"
|
||||
flags = DROPDEL
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/energy/used/dropped(mob/user)
|
||||
/obj/item/restraints/handcuffs/energy/used/dropped(mob/user)
|
||||
user.visible_message("<span class='danger'>[user]'s [src] break in a discharge of energy!</span>", \
|
||||
"<span class='userdanger'>[user]'s [src] break in a discharge of energy!</span>")
|
||||
var/datum/effect_system/spark_spread/S = new
|
||||
@@ -509,7 +509,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
S.start()
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/abductor_baton/examine(mob/user)
|
||||
/obj/item/abductor_baton/examine(mob/user)
|
||||
..()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
@@ -529,54 +529,54 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
icon_state = "abductor_headset"
|
||||
item_state = "abductor_headset"
|
||||
keyslot2 = new /obj/item/device/encryptionkey/heads/captain
|
||||
flags_2 = BANG_PROTECT_2
|
||||
|
||||
/obj/item/device/radio/headset/abductor/Initialize(mapload)
|
||||
..()
|
||||
SET_SECONDARY_FLAG(src, BANG_PROTECT)
|
||||
make_syndie()
|
||||
|
||||
/obj/item/device/radio/headset/abductor/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
/obj/item/device/radio/headset/abductor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
return // Stops humans from disassembling abductor headsets.
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/item/weapon/scalpel/alien
|
||||
/obj/item/scalpel/alien
|
||||
name = "alien scalpel"
|
||||
desc = "It's a gleaming sharp knife made out of silvery-green metal."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
origin_tech = "materials=2;biotech=2;abductor=2"
|
||||
toolspeed = 0.25
|
||||
|
||||
/obj/item/weapon/hemostat/alien
|
||||
/obj/item/hemostat/alien
|
||||
name = "alien hemostat"
|
||||
desc = "You've never seen this before."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
origin_tech = "materials=2;biotech=2;abductor=2"
|
||||
toolspeed = 0.25
|
||||
|
||||
/obj/item/weapon/retractor/alien
|
||||
/obj/item/retractor/alien
|
||||
name = "alien retractor"
|
||||
desc = "You're not sure if you want the veil pulled back."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
origin_tech = "materials=2;biotech=2;abductor=2"
|
||||
toolspeed = 0.25
|
||||
|
||||
/obj/item/weapon/circular_saw/alien
|
||||
/obj/item/circular_saw/alien
|
||||
name = "alien saw"
|
||||
desc = "Do the aliens also lose this, and need to find an alien hatchet?"
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
origin_tech = "materials=2;biotech=2;abductor=2"
|
||||
toolspeed = 0.25
|
||||
|
||||
/obj/item/weapon/surgicaldrill/alien
|
||||
/obj/item/surgicaldrill/alien
|
||||
name = "alien drill"
|
||||
desc = "Maybe alien surgeons have finally found a use for the drill."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
origin_tech = "materials=2;biotech=2;abductor=2"
|
||||
toolspeed = 0.25
|
||||
|
||||
/obj/item/weapon/cautery/alien
|
||||
/obj/item/cautery/alien
|
||||
name = "alien cautery"
|
||||
desc = "Why would bloodless aliens have a tool to stop bleeding? \
|
||||
Unless..."
|
||||
@@ -611,7 +611,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/wrench))
|
||||
if(istype(I, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start disassembling [src]...</span>")
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
if(do_after(user, 30*I.toolspeed, target = src))
|
||||
@@ -706,8 +706,8 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
state = 1
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_abductor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(istype(W, /obj/item/weldingtool) && !anchored )
|
||||
var/obj/item/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0,user))
|
||||
user.visible_message("<span class='warning'>[user] disassembles the airlock assembly.</span>", \
|
||||
"You start to disassemble the airlock assembly...")
|
||||
@@ -720,7 +720,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
qdel(src)
|
||||
else
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/airlock_painter))
|
||||
else if(istype(W, /obj/item/airlock_painter))
|
||||
return // no repainting
|
||||
else if(istype(W, /obj/item/stack/sheet))
|
||||
return // no material modding
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Abductor Basic"
|
||||
uniform = /obj/item/clothing/under/color/grey //they're greys gettit
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
back = /obj/item/storage/backpack
|
||||
ears = /obj/item/device/radio/headset/abductor
|
||||
|
||||
/datum/outfit/abductor/proc/get_team_console(team_number)
|
||||
@@ -23,9 +23,9 @@
|
||||
var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
|
||||
if(V)
|
||||
console.AddVest(V)
|
||||
V.flags |= NODROP
|
||||
V.flags_1 |= NODROP_1
|
||||
|
||||
var/obj/item/weapon/storage/backpack/B = locate() in H
|
||||
var/obj/item/storage/backpack/B = locate() in H
|
||||
if(B)
|
||||
for(var/obj/item/device/abductor/gizmo/G in B.contents)
|
||||
console.AddGizmo(G)
|
||||
@@ -40,11 +40,11 @@
|
||||
name = "Abductor Agent"
|
||||
head = /obj/item/clothing/head/helmet/abductor
|
||||
suit = /obj/item/clothing/suit/armor/abductor/vest
|
||||
suit_store = /obj/item/weapon/abductor_baton
|
||||
belt = /obj/item/weapon/storage/belt/military/abductor/full
|
||||
suit_store = /obj/item/abductor_baton
|
||||
belt = /obj/item/storage/belt/military/abductor/full
|
||||
|
||||
backpack_contents = list(
|
||||
/obj/item/weapon/gun/energy/alien = 1,
|
||||
/obj/item/gun/energy/alien = 1,
|
||||
/obj/item/device/abductor/silencer = 1
|
||||
)
|
||||
|
||||
@@ -58,5 +58,5 @@
|
||||
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||
..()
|
||||
if(!visualsOnly)
|
||||
var/obj/item/weapon/implant/abductor/beamplant = new /obj/item/weapon/implant/abductor(H)
|
||||
var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
|
||||
beamplant.implant(H)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.dna.species.id == "abductor")
|
||||
return 1
|
||||
for(var/obj/item/weapon/implant/abductor/A in H.implants)
|
||||
for(var/obj/item/implant/abductor/A in H.implants)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
to_chat(owner, "<span class='boldannounce'>You lay an egg!</span>")
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(owner.loc)
|
||||
var/obj/item/reagent_containers/food/snacks/egg/egg = new(owner.loc)
|
||||
egg.reagents.add_reagent("sacid",20)
|
||||
egg.desc += " It smells bad."
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
dat+="<br>"
|
||||
dat += "<a href='?src=\ref[src];select_disguise=1'>Select Agent Vest Disguise</a><br>"
|
||||
dat += "<a href='?src=\ref[src];toggle_vest=1'>[vest.flags & NODROP ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
dat += "<a href='?src=\ref[src];toggle_vest=1'>[vest.flags_1 & NODROP_1 ? "Unlock" : "Lock"] Vest</a><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO AGENT VEST DETECTED</span>"
|
||||
var/datum/browser/popup = new(user, "computer", "Abductor Console", 400, 500)
|
||||
@@ -95,7 +95,7 @@
|
||||
else if(href_list["dispense"])
|
||||
switch(href_list["dispense"])
|
||||
if("baton")
|
||||
Dispense(/obj/item/weapon/abductor_baton,cost=2)
|
||||
Dispense(/obj/item/abductor_baton,cost=2)
|
||||
if("helmet")
|
||||
Dispense(/obj/item/clothing/head/helmet/abductor)
|
||||
if("silencer")
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
//TODO : replace with presets or spectrum
|
||||
return rgb(rand(0,255),rand(0,255),rand(0,255))
|
||||
|
||||
/obj/machinery/abductor/gland_dispenser/New()
|
||||
..()
|
||||
/obj/machinery/abductor/gland_dispenser/Initialize()
|
||||
. = ..()
|
||||
gland_types = subtypesof(/obj/item/organ/heart/gland)
|
||||
gland_types = shuffle(gland_types)
|
||||
gland_colors = new/list(gland_types.len)
|
||||
@@ -58,7 +58,7 @@
|
||||
popup.open()
|
||||
return
|
||||
|
||||
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
|
||||
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/organ/heart/gland))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
var/dat
|
||||
dat += "<h3> Experiment </h3>"
|
||||
if(occupant)
|
||||
var/obj/item/weapon/photo/P = new
|
||||
var/obj/item/photo/P = new
|
||||
P.photocreate(null, icon(dissection_icon(occupant), dir = SOUTH))
|
||||
user << browse_rsc(P.img, "dissection_img")
|
||||
dat += "<table><tr><td>"
|
||||
|
||||
@@ -1093,7 +1093,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 10)
|
||||
/datum/action/innate/borer/jumpstart_host
|
||||
name = "Jumpstart Host"
|
||||
desc = "Bring your host back to life."
|
||||
icon_icon = 'icons/obj/weapons.dmi'
|
||||
icon_icon = 'icons/obj/items_and_weapons.dmi'
|
||||
button_icon_state = "defibpaddles0"
|
||||
|
||||
/datum/action/innate/borer/jumpstart_host/Activate()
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>Picking up the swarmer may cause it to activate. You should be careful about this.</span>")
|
||||
|
||||
/obj/effect/mob_spawn/swarmer/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/screwdriver) && user.a_intent != INTENT_HARM)
|
||||
/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver) && user.a_intent != INTENT_HARM)
|
||||
user.visible_message("<span class='warning'>[usr.name] deactivates [src].</span>",
|
||||
"<span class='notice'>After some fiddling, you find a way to disable [src]'s power source.</span>",
|
||||
"<span class='italics'>You hear clicking.</span>")
|
||||
@@ -91,7 +91,7 @@
|
||||
projectiletype = /obj/item/projectile/beam/disabler
|
||||
ranged_cooldown_time = 20
|
||||
projectilesound = 'sound/weapons/taser2.ogg'
|
||||
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/weapon/ore/bluespace_crystal)
|
||||
loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/ore/bluespace_crystal)
|
||||
del_on_death = 1
|
||||
deathmessage = "explodes with a sharp pop!"
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
@@ -191,7 +191,7 @@
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory
|
||||
/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
|
||||
return FALSE
|
||||
|
||||
/obj/item/clockwork/alloy_shards/IntegrateAmount()
|
||||
@@ -469,7 +469,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(ishuman(target) && (!H.handcuffed))
|
||||
H.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(H)
|
||||
H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H)
|
||||
H.update_handcuffed()
|
||||
add_logs(src, H, "handcuffed")
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
src.visible_message("<span class='warning'><font size=4>[src]'s Staff is flung free as their body explodes.</font></span>")
|
||||
var/obj/structure/ladder/unbreakable/hades/churchLadder = new/obj/structure/ladder/unbreakable/hades(T)
|
||||
var/obj/structure/ladder/unbreakable/hades/bodyLadder = new/obj/structure/ladder/unbreakable/hades(get_turf(src))
|
||||
var/obj/item/weapon/hades_staff/HS = new/obj/item/weapon/hades_staff(get_turf(src))
|
||||
var/obj/item/hades_staff/HS = new/obj/item/hades_staff(get_turf(src))
|
||||
HS.throw_at_fast(pick(orange(src,7)),10,1)
|
||||
churchLadder.up = bodyLadder
|
||||
bodyLadder.down = churchLadder
|
||||
@@ -447,8 +447,8 @@
|
||||
if(isIndulged)
|
||||
sinPerson << "<span class='warning'>Your stomach growls, you feel hungry.</span>"
|
||||
var/list/allTypes = list()
|
||||
for(var/A in typesof(/obj/item/weapon/reagent_containers/food/snacks))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/O = A
|
||||
for(var/A in typesof(/obj/item/reagent_containers/food/snacks))
|
||||
var/obj/item/reagent_containers/food/snacks/O = A
|
||||
if(initial(O.cooked_type))
|
||||
allTypes += A
|
||||
for(var/i in 1 to 10)
|
||||
@@ -461,12 +461,12 @@
|
||||
/proc/sin_Pride(var/mob/living/carbon/human/sinPerson, var/isIndulged)
|
||||
if(isIndulged)
|
||||
sinPerson << "<span class='warning'>You feel strong enough to take on the world.</span>"
|
||||
var/obj/item/weapon/twohanded/sin_pride/good = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson))
|
||||
var/obj/item/twohanded/sin_pride/good = new/obj/item/twohanded/sin_pride(get_turf(sinPerson))
|
||||
good.name = "Indulged [good.name]"
|
||||
good.pride_direction = FALSE
|
||||
else
|
||||
sinPerson << "<span class='warning'>You feel small and weak, like the entire world is against you.</span>"
|
||||
var/obj/item/weapon/twohanded/sin_pride/bad = new/obj/item/weapon/twohanded/sin_pride(get_turf(sinPerson))
|
||||
var/obj/item/twohanded/sin_pride/bad = new/obj/item/twohanded/sin_pride(get_turf(sinPerson))
|
||||
bad.name = "Punished [bad.name]"
|
||||
bad.pride_direction = TRUE
|
||||
|
||||
@@ -550,7 +550,7 @@
|
||||
icon = 'icons/effects/224x224.dmi'
|
||||
|
||||
|
||||
/obj/item/weapon/twohanded/sin_pride
|
||||
/obj/item/twohanded/sin_pride
|
||||
icon_state = "mjollnir0"
|
||||
name = "Pride-struck Hammer"
|
||||
desc = "It resonates an aura of Pride."
|
||||
@@ -564,11 +564,11 @@
|
||||
hitsound = 'sound/weapons/blade1.ogg'
|
||||
var/pride_direction = FALSE
|
||||
|
||||
/obj/item/weapon/twohanded/sin_pride/update_icon()
|
||||
/obj/item/twohanded/sin_pride/update_icon()
|
||||
icon_state = "mjollnir[wielded]"
|
||||
return
|
||||
|
||||
/obj/item/weapon/twohanded/sin_pride/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
|
||||
/obj/item/twohanded/sin_pride/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
|
||||
if(!proximity) return
|
||||
if(wielded)
|
||||
if(istype(A,/mob/living/carbon/human))
|
||||
@@ -655,7 +655,7 @@
|
||||
attacktext = "strikes at"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
butcher_results = list(/obj/item/clothing/mask/gas/cyborg/hades = 1,/obj/item/clothing/suit/hooded/chaplain_hoodie/hades = 1,/obj/item/weapon/hades_staff/fake = 1)
|
||||
butcher_results = list(/obj/item/clothing/mask/gas/cyborg/hades = 1,/obj/item/clothing/suit/hooded/chaplain_hoodie/hades = 1,/obj/item/hades_staff/fake = 1)
|
||||
|
||||
unsuitable_atmos_damage = 0
|
||||
del_on_death = 0
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/obj/structure/chair/hades/New()
|
||||
..()
|
||||
flags |= NODECONSTRUCT
|
||||
flags_1 |= NODECONSTRUCT_1
|
||||
for(var/obj/structure/kitchenspike/KS in range(12))
|
||||
watchedSpikes += KS
|
||||
|
||||
@@ -39,14 +39,14 @@
|
||||
playsound(get_turf(src), 'sound/effects/pope_entry.ogg', 100, 1)
|
||||
sleep(100)
|
||||
playsound(get_turf(src), 'sound/effects/hyperspace_end.ogg', 100, 1)
|
||||
new/obj/item/weapon/hades_staff/imbued(get_turf(src))
|
||||
new/obj/item/hades_staff/imbued(get_turf(src))
|
||||
src.visible_message("<span class='warning'>[src] shatters into a thousand shards, a staff falling from it.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/chair/hades/attackby(obj/item/weapon/W, mob/user, params)
|
||||
/obj/structure/chair/hades/attackby(obj/item/W, mob/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/hades_staff))
|
||||
var/obj/item/weapon/hades_staff/HS = W
|
||||
if(istype(W, /obj/item/hades_staff))
|
||||
var/obj/item/hades_staff/HS = W
|
||||
if(!HS.isKey)
|
||||
return
|
||||
src.visible_message("<span class='warning'>[user] inserts the [W] into the [src], giving it a quick turn.</span>")
|
||||
@@ -74,11 +74,11 @@
|
||||
/obj/structure/ladder/unbreakable/hades/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/weapon/paper/hades_instructions
|
||||
/obj/item/paper/hades_instructions
|
||||
name = "paper- 'Hastily Scrawled Letter'"
|
||||
info = "The Master has instructed us to collect corpses for the ritual, and told us to deposity them in the Ritual Room, behind a bookcase in the library. The Master has locked the device to only work with his key, so no more accidents happen."
|
||||
|
||||
/obj/item/weapon/hades_staff
|
||||
/obj/item/hades_staff
|
||||
name = "Staff of Hades"
|
||||
desc = "A large, dark staff, with a set of key-like prongs on the end."
|
||||
icon_state = "staffofchange"
|
||||
@@ -93,12 +93,12 @@
|
||||
block_chance = 25
|
||||
var/isKey = 1
|
||||
|
||||
/obj/item/weapon/hades_staff/fake
|
||||
/obj/item/hades_staff/fake
|
||||
name = "Inert Staff of Hades"
|
||||
desc = "A large, dark staff."
|
||||
isKey = 0
|
||||
|
||||
/obj/item/weapon/hades_staff/imbued
|
||||
/obj/item/hades_staff/imbued
|
||||
name = "Imbued Staff of Hades"
|
||||
desc = " Bestowed with the power of wayward souls, this Staff allows the wielder to judge a target."
|
||||
force = 75
|
||||
@@ -107,7 +107,7 @@
|
||||
var/lastJudge = 0
|
||||
var/judgeCooldown = 150
|
||||
|
||||
/obj/item/weapon/hades_staff/imbued/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
|
||||
/obj/item/hades_staff/imbued/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
wander = 0
|
||||
attacktext = "glomps"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 2)
|
||||
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2)
|
||||
|
||||
var/morphed = 0
|
||||
var/morphed = FALSE
|
||||
var/atom/movable/form = null
|
||||
var/morph_time = 0
|
||||
var/static/list/blacklist_typecache = typecacheof(list(
|
||||
@@ -93,7 +93,10 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target)
|
||||
morphed = 1
|
||||
if(morphed)
|
||||
to_chat(src, "<span class='warning'>You must restore to your original form first!</span>")
|
||||
return
|
||||
morphed = TRUE
|
||||
form = target
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly twists and changes shape, becoming a copy of [target]!</span>", \
|
||||
@@ -117,8 +120,9 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/restore()
|
||||
if(!morphed)
|
||||
to_chat(src, "<span class='warning'>You're already in your normal form!</span>")
|
||||
return
|
||||
morphed = 0
|
||||
morphed = FALSE
|
||||
form = null
|
||||
alpha = initial(alpha)
|
||||
color = initial(color)
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
//damage, gibbing, and dying
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
. = ..()
|
||||
if(istype(W, /obj/item/weapon/nullrod))
|
||||
if(istype(W, /obj/item/nullrod))
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='revendanger'>As \the [W] passes through you, you feel your essence draining away!</span>")
|
||||
adjustBruteLoss(25) //hella effective
|
||||
@@ -218,7 +218,7 @@
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into a fine pile of blue dust.</span>")
|
||||
var/reforming_essence = essence_regen_cap //retain the gained essence capacity
|
||||
var/obj/item/weapon/ectoplasm/revenant/R = new(get_turf(src))
|
||||
var/obj/item/ectoplasm/revenant/R = new(get_turf(src))
|
||||
R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls
|
||||
R.client_to_revive = client //If the essence reforms, the old revenant is put back in the body
|
||||
R.revenant = src
|
||||
@@ -321,7 +321,7 @@
|
||||
|
||||
|
||||
//reforming
|
||||
/obj/item/weapon/ectoplasm/revenant
|
||||
/obj/item/ectoplasm/revenant
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
@@ -333,14 +333,14 @@
|
||||
var/client/client_to_revive
|
||||
var/mob/living/simple_animal/revenant/revenant
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/New()
|
||||
/obj/item/ectoplasm/revenant/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/try_reform), 600)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/scatter()
|
||||
/obj/item/ectoplasm/revenant/proc/scatter()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/try_reform()
|
||||
/obj/item/ectoplasm/revenant/proc/try_reform()
|
||||
if(reforming)
|
||||
reforming = FALSE
|
||||
reform()
|
||||
@@ -348,7 +348,7 @@
|
||||
inert = TRUE
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_self(mob/user)
|
||||
/obj/item/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming || inert)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
@@ -356,21 +356,21 @@
|
||||
user.drop_item()
|
||||
scatter()
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
if(inert)
|
||||
return
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
scatter()
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/examine(mob/user)
|
||||
/obj/item/ectoplasm/revenant/examine(mob/user)
|
||||
..()
|
||||
if(inert)
|
||||
to_chat(user, "<span class='revennotice'>It seems inert.</span>")
|
||||
else if(reforming)
|
||||
to_chat(user, "<span class='revenwarning'>It is shifting and distorted. It would be wise to destroy this.</span>")
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/reform()
|
||||
/obj/item/ectoplasm/revenant/proc/reform()
|
||||
if(QDELETED(src) || QDELETED(revenant) || inert)
|
||||
return
|
||||
var/key_of_revenant
|
||||
@@ -412,7 +412,7 @@
|
||||
revenant = null
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/Destroy()
|
||||
/obj/item/ectoplasm/revenant/Destroy()
|
||||
if(!QDELETED(revenant))
|
||||
qdel(revenant)
|
||||
..()
|
||||
|
||||
@@ -238,8 +238,8 @@
|
||||
INVOKE_ASYNC(src, .proc/defile, T)
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant/defile/proc/defile(turf/T)
|
||||
if(T.flags & NOJAUNT)
|
||||
T.flags -= NOJAUNT
|
||||
if(T.flags_1 & NOJAUNT_1)
|
||||
T.flags_1 &= ~NOJAUNT_1
|
||||
new /obj/effect/temp_visual/revenant(T)
|
||||
if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15))
|
||||
var/turf/open/floor/floor = T
|
||||
|
||||
@@ -114,9 +114,9 @@
|
||||
var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge
|
||||
synd_mind.current.put_in_hands_or_del(challenge)
|
||||
|
||||
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/weapon/card/id)
|
||||
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id)
|
||||
if(foundIDs.len)
|
||||
for(var/obj/item/weapon/card/id/ID in foundIDs)
|
||||
for(var/obj/item/card/id/ID in foundIDs)
|
||||
ID.name = "lead agent card"
|
||||
ID.access += ACCESS_SYNDICATE_LEADER
|
||||
else
|
||||
@@ -127,7 +127,7 @@
|
||||
A.command = TRUE
|
||||
|
||||
if(nuke_code)
|
||||
var/obj/item/weapon/paper/P = new
|
||||
var/obj/item/paper/P = new
|
||||
P.info = "The nuclear authorization code is: <b>[nuke_code]</b>"
|
||||
P.name = "nuclear bomb code"
|
||||
var/mob/living/carbon/human/H = synd_mind.current
|
||||
@@ -186,7 +186,7 @@
|
||||
|
||||
/datum/game_mode/nuclear/declare_completion()
|
||||
var/disk_rescued = 1
|
||||
for(var/obj/item/weapon/disk/nuclear/D in GLOB.poi_list)
|
||||
for(var/obj/item/disk/nuclear/D in GLOB.poi_list)
|
||||
if(!D.onCentCom())
|
||||
disk_rescued = 0
|
||||
break
|
||||
@@ -323,12 +323,12 @@
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
back = /obj/item/weapon/storage/backpack
|
||||
back = /obj/item/storage/backpack
|
||||
ears = /obj/item/device/radio/headset/syndicate/alt
|
||||
l_pocket = /obj/item/weapon/pinpointer/syndicate
|
||||
id = /obj/item/weapon/card/id/syndicate
|
||||
belt = /obj/item/weapon/gun/ballistic/automatic/pistol
|
||||
backpack_contents = list(/obj/item/weapon/storage/box/syndie=1)
|
||||
l_pocket = /obj/item/pinpointer/syndicate
|
||||
id = /obj/item/card/id/syndicate
|
||||
belt = /obj/item/gun/ballistic/automatic/pistol
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1)
|
||||
|
||||
var/tc = 25
|
||||
|
||||
@@ -347,9 +347,9 @@
|
||||
U.hidden_uplink.telecrystals = tc
|
||||
H.equip_to_slot_or_del(U, slot_in_backpack)
|
||||
|
||||
var/obj/item/weapon/implant/weapons_auth/W = new/obj/item/weapon/implant/weapons_auth(H)
|
||||
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
|
||||
W.implant(H)
|
||||
var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(H)
|
||||
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
|
||||
E.implant(H)
|
||||
H.faction |= "syndicate"
|
||||
H.update_icons()
|
||||
@@ -360,10 +360,10 @@
|
||||
glasses = /obj/item/clothing/glasses/night
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
r_pocket = /obj/item/weapon/tank/internals/emergency_oxygen/engi
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen/engi
|
||||
internals_slot = slot_r_store
|
||||
belt = /obj/item/weapon/storage/belt/military
|
||||
r_hand = /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog
|
||||
backpack_contents = list(/obj/item/weapon/storage/box/syndie=1,\
|
||||
/obj/item/weapon/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/weapon/gun/ballistic/automatic/pistol=1)
|
||||
belt = /obj/item/storage/belt/military
|
||||
r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
/obj/item/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/gun/ballistic/automatic/pistol=1)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
to_chat(user, "You've attracted the attention of powerful forces within the syndicate. A bonus bundle of telecrystals has been granted to your team. Great things await you if you complete the mission.")
|
||||
|
||||
for(var/V in GLOB.syndicate_shuttle_boards)
|
||||
var/obj/item/weapon/circuitboard/computer/syndicate_shuttle/board = V
|
||||
var/obj/item/circuitboard/computer/syndicate_shuttle/board = V
|
||||
board.challenge = TRUE
|
||||
|
||||
var/obj/item/device/radio/uplink/nuclear/U = new(get_turf(user))
|
||||
@@ -74,7 +74,7 @@
|
||||
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
|
||||
return 0
|
||||
for(var/V in GLOB.syndicate_shuttle_boards)
|
||||
var/obj/item/weapon/circuitboard/computer/syndicate_shuttle/board = V
|
||||
var/obj/item/circuitboard/computer/syndicate_shuttle/board = V
|
||||
if(board.moved)
|
||||
to_chat(user, "The shuttle has already been moved! You have forfeit the right to declare war.")
|
||||
return 0
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/r_code = "ADMIN"
|
||||
var/yes_code = FALSE
|
||||
var/safety = TRUE
|
||||
var/obj/item/weapon/disk/nuclear/auth = null
|
||||
var/obj/item/disk/nuclear/auth = null
|
||||
use_power = NO_POWER_USE
|
||||
var/previous_level = ""
|
||||
var/obj/item/nuke_core/core = null
|
||||
@@ -85,13 +85,12 @@
|
||||
. = ..()
|
||||
var/obj/machinery/nuclearbomb/existing = locate("syndienuke") in GLOB.nuke_list
|
||||
if(existing)
|
||||
qdel(src)
|
||||
throw EXCEPTION("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]")
|
||||
return 0
|
||||
stack_trace("Attempted to spawn a syndicate nuke while one already exists at [existing.loc.x],[existing.loc.y],[existing.loc.z]")
|
||||
return INITIALIZE_HINT_QDEL
|
||||
tag = "syndienuke"
|
||||
|
||||
/obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params)
|
||||
if (istype(I, /obj/item/weapon/disk/nuclear))
|
||||
if (istype(I, /obj/item/disk/nuclear))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.forceMove(src)
|
||||
@@ -101,7 +100,7 @@
|
||||
|
||||
switch(deconstruction_state)
|
||||
if(NUKESTATE_INTACT)
|
||||
if(istype(I, /obj/item/weapon/screwdriver/nuke))
|
||||
if(istype(I, /obj/item/screwdriver/nuke))
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>You start removing [src]'s front panel's screws...</span>")
|
||||
if(do_after(user, 60*I.toolspeed,target=src))
|
||||
@@ -110,7 +109,7 @@
|
||||
update_icon()
|
||||
return
|
||||
if(NUKESTATE_UNSCREWED)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
to_chat(user, "<span class='notice'>You start removing [src]'s front panel...</span>")
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
if(do_after(user,30*I.toolspeed,target=src))
|
||||
@@ -119,8 +118,8 @@
|
||||
update_icon()
|
||||
return
|
||||
if(NUKESTATE_PANEL_REMOVED)
|
||||
if(istype(I, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/welder = I
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/welder = I
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
to_chat(user, "<span class='notice'>You start cutting [src]'s inner plate...</span>")
|
||||
if(welder.remove_fuel(1,user))
|
||||
@@ -130,7 +129,7 @@
|
||||
update_icon()
|
||||
return
|
||||
if(NUKESTATE_WELDED)
|
||||
if(istype(I, /obj/item/weapon/crowbar))
|
||||
if(istype(I, /obj/item/crowbar))
|
||||
to_chat(user, "<span class='notice'>You start prying off [src]'s inner plate...</span>")
|
||||
playsound(loc, I.usesound, 100, 1)
|
||||
if(do_after(user,50*I.toolspeed,target=src))
|
||||
@@ -297,7 +296,7 @@
|
||||
if("insert_disk")
|
||||
if(!auth)
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/weapon/disk/nuclear))
|
||||
if(istype(I, /obj/item/disk/nuclear))
|
||||
usr.drop_item()
|
||||
I.forceMove(src)
|
||||
auth = I
|
||||
@@ -363,7 +362,7 @@
|
||||
if(safety)
|
||||
if(timing)
|
||||
set_security_level(previous_level)
|
||||
for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
for(var/obj/item/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
S.switch_mode_to(initial(S.mode))
|
||||
S.nuke_warning = FALSE
|
||||
timing = FALSE
|
||||
@@ -382,14 +381,14 @@
|
||||
bomb_set = TRUE
|
||||
set_security_level("delta")
|
||||
detonation_timer = world.time + (timer_set * 10)
|
||||
for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
for(var/obj/item/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
S.switch_mode_to(TRACK_INFILTRATOR)
|
||||
countdown.start()
|
||||
else
|
||||
bomb_set = FALSE
|
||||
detonation_timer = null
|
||||
set_security_level(previous_level)
|
||||
for(var/obj/item/weapon/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
for(var/obj/item/pinpointer/syndicate/S in GLOB.pinpointer_list)
|
||||
S.switch_mode_to(initial(S.mode))
|
||||
S.nuke_warning = FALSE
|
||||
countdown.stop()
|
||||
@@ -483,7 +482,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
SSmapping.remove_nuke_threat(src)
|
||||
|
||||
//==========DAT FUKKEN DISK===============
|
||||
/obj/item/weapon/disk
|
||||
/obj/item/disk
|
||||
icon = 'icons/obj/module.dmi'
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
item_state = "card-id"
|
||||
@@ -491,23 +490,23 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
|
||||
icon_state = "datadisk0"
|
||||
|
||||
/obj/item/weapon/disk/nuclear
|
||||
/obj/item/disk/nuclear
|
||||
name = "nuclear authentication disk"
|
||||
desc = "Better keep this safe."
|
||||
icon_state = "nucleardisk"
|
||||
persistence_replacement = /obj/item/weapon/disk/fakenucleardisk
|
||||
persistence_replacement = /obj/item/disk/fakenucleardisk
|
||||
max_integrity = 250
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/weapon/disk/nuclear/New()
|
||||
/obj/item/disk/nuclear/New()
|
||||
..()
|
||||
GLOB.poi_list |= src
|
||||
set_stationloving(TRUE, inform_admins=TRUE)
|
||||
|
||||
/obj/item/weapon/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/claymore/highlander))
|
||||
var/obj/item/weapon/claymore/highlander/H = I
|
||||
/obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/claymore/highlander))
|
||||
var/obj/item/claymore/highlander/H = I
|
||||
if(H.nuke_disk)
|
||||
to_chat(user, "<span class='notice'>Wait... what?</span>")
|
||||
qdel(H.nuke_disk)
|
||||
@@ -519,13 +518,13 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/disk/nuclear/Destroy(force=FALSE)
|
||||
/obj/item/disk/nuclear/Destroy(force=FALSE)
|
||||
// respawning is handled in /obj/Destroy()
|
||||
if(force)
|
||||
GLOB.poi_list -= src
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/disk/nuclear/suicide_act(mob/user)
|
||||
/obj/item/disk/nuclear/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is going delta! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(user.loc, 'sound/machines/alarm.ogg', 50, -1, 1)
|
||||
var/end_time = world.time + 100
|
||||
@@ -543,7 +542,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
user.visible_message("<span class='suicide'>[user] was destroyed by the nuclear blast!</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/weapon/disk/fakenucleardisk
|
||||
/obj/item/disk/fakenucleardisk
|
||||
name = "cheap plastic imitation of the nuclear authentication disk"
|
||||
desc = "Broken dreams and a faint odor of cheese."
|
||||
icon_state = "nucleardisk"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
//Pinpointers are used to track atoms from a distance as long as they're on the same z-level. The captain and nuke ops have ones that track the nuclear authentication disk.
|
||||
/obj/item/weapon/pinpointer
|
||||
/obj/item/pinpointer
|
||||
name = "pinpointer"
|
||||
desc = "A handheld tracking device that locks onto certain signals."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "pinoff"
|
||||
flags = CONDUCT
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
item_state = "electronic"
|
||||
@@ -23,16 +23,16 @@
|
||||
var/nuke_warning = FALSE // If we've set off a miniature alarm about an armed nuke
|
||||
var/mode = TRACK_NUKE_DISK //What are we looking for?
|
||||
|
||||
/obj/item/weapon/pinpointer/New()
|
||||
/obj/item/pinpointer/New()
|
||||
..()
|
||||
GLOB.pinpointer_list += src
|
||||
|
||||
/obj/item/weapon/pinpointer/Destroy()
|
||||
/obj/item/pinpointer/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
GLOB.pinpointer_list -= src
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/pinpointer/attack_self(mob/living/user)
|
||||
/obj/item/pinpointer/attack_self(mob/living/user)
|
||||
active = !active
|
||||
user.visible_message("<span class='notice'>[user] [active ? "" : "de"]activates their pinpointer.</span>", "<span class='notice'>You [active ? "" : "de"]activate your pinpointer.</span>")
|
||||
playsound(user, 'sound/items/screwdriver2.ogg', 50, 1)
|
||||
@@ -43,14 +43,14 @@
|
||||
target = null //Restarting the pinpointer forces a target reset
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/item/weapon/pinpointer/attackby(obj/item/I, mob/living/user, params)
|
||||
/obj/item/pinpointer/attackby(obj/item/I, mob/living/user, params)
|
||||
if(mode != TRACK_ATOM)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] tunes [src] to [I].</span>", "<span class='notice'>You fine-tune [src]'s tracking to track [I].</span>")
|
||||
playsound(src, 'sound/machines/click.ogg', 50, 1)
|
||||
constant_target = I
|
||||
|
||||
/obj/item/weapon/pinpointer/examine(mob/user)
|
||||
/obj/item/pinpointer/examine(mob/user)
|
||||
..()
|
||||
var/msg = "Its tracking indicator reads "
|
||||
switch(mode)
|
||||
@@ -73,7 +73,7 @@
|
||||
if(bomb.timing)
|
||||
to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()]")
|
||||
|
||||
/obj/item/weapon/pinpointer/process()
|
||||
/obj/item/pinpointer/process()
|
||||
if(!active)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
return
|
||||
@@ -82,7 +82,7 @@
|
||||
my_god_jc_a_bomb()
|
||||
addtimer(CALLBACK(src, .proc/refresh_target), 50, TIMER_UNIQUE)
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/scan_for_target() //Looks for whatever it's tracking
|
||||
/obj/item/pinpointer/proc/scan_for_target() //Looks for whatever it's tracking
|
||||
if(target)
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
@@ -91,7 +91,7 @@
|
||||
return
|
||||
switch(mode)
|
||||
if(TRACK_NUKE_DISK)
|
||||
var/obj/item/weapon/disk/nuclear/N = locate() in GLOB.poi_list
|
||||
var/obj/item/disk/nuclear/N = locate() in GLOB.poi_list
|
||||
target = N
|
||||
if(TRACK_MALF_AI)
|
||||
for(var/V in GLOB.ai_list)
|
||||
@@ -121,7 +121,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
target = locate(target_x, target_y, T.z)
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction
|
||||
/obj/item/pinpointer/proc/point_to_target() //If we found what we're looking for, show the distance and direction
|
||||
if(!active)
|
||||
return
|
||||
if(!target || (mode == TRACK_ATOM && !constant_target))
|
||||
@@ -144,7 +144,7 @@
|
||||
if(16 to INFINITY)
|
||||
icon_state = "pinon[nuke_warning ? "alert" : "far"]"
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/my_god_jc_a_bomb() //If we should get the hell back to the ship
|
||||
/obj/item/pinpointer/proc/my_god_jc_a_bomb() //If we should get the hell back to the ship
|
||||
for(var/obj/machinery/nuclearbomb/bomb in GLOB.nuke_list)
|
||||
if(bomb.timing)
|
||||
if(!nuke_warning)
|
||||
@@ -154,7 +154,7 @@
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='userdanger'>Your [name] vibrates and lets out a tinny alarm. Uh oh.</span>")
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/switch_mode_to(new_mode) //If we shouldn't be tracking what we are
|
||||
/obj/item/pinpointer/proc/switch_mode_to(new_mode) //If we shouldn't be tracking what we are
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
to_chat(L, "<span class='userdanger'>Your [name] beeps as it reconfigures its tracking algorithms.</span>")
|
||||
@@ -162,18 +162,18 @@
|
||||
mode = new_mode
|
||||
target = null //Switch modes so we can find the new target
|
||||
|
||||
/obj/item/weapon/pinpointer/proc/refresh_target() //Periodically removes the target to allow the pinpointer to update (i.e. malf AI shunts, an operative dies)
|
||||
/obj/item/pinpointer/proc/refresh_target() //Periodically removes the target to allow the pinpointer to update (i.e. malf AI shunts, an operative dies)
|
||||
target = null
|
||||
|
||||
/obj/item/weapon/pinpointer/syndicate //Syndicate pinpointers automatically point towards the infiltrator once the nuke is active.
|
||||
/obj/item/pinpointer/syndicate //Syndicate pinpointers automatically point towards the infiltrator once the nuke is active.
|
||||
name = "syndicate pinpointer"
|
||||
desc = "A handheld tracking device that locks onto certain signals. It's configured to switch tracking modes once it detects the activation signal of a nuclear device."
|
||||
|
||||
/obj/item/weapon/pinpointer/syndicate/cyborg //Cyborg pinpointers just look for a random operative.
|
||||
/obj/item/pinpointer/syndicate/cyborg //Cyborg pinpointers just look for a random operative.
|
||||
name = "cyborg syndicate pinpointer"
|
||||
desc = "An integrated tracking device, jury-rigged to search for living Syndicate operatives."
|
||||
mode = TRACK_OPERATIVES
|
||||
flags = NODROP
|
||||
flags_1 = NODROP_1
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
return target
|
||||
|
||||
/datum/objective/proc/find_target_by_role(role, role_type=0, invert=0)//Option sets either to check assigned role or special role. Default to assigned., invert inverts the check, eg: "Don't choose a Ling"
|
||||
var/list/candidates = list() //Let's compile a list and THEN pick one randomly, not just first come first serve...
|
||||
for(var/datum/mind/possible_target in get_crewmember_minds())
|
||||
if((possible_target != owner) && ishuman(possible_target.current))
|
||||
var/is_role = 0
|
||||
@@ -56,11 +55,12 @@
|
||||
if(invert)
|
||||
if(is_role)
|
||||
continue
|
||||
candidates += possible_target
|
||||
target = possible_target
|
||||
break
|
||||
else if(is_role)
|
||||
candidates += possible_target
|
||||
if(candidates)
|
||||
target = pick(candidates)
|
||||
target = possible_target
|
||||
break
|
||||
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/proc/update_explanation_text()
|
||||
@@ -442,7 +442,8 @@ GLOBAL_LIST_EMPTY(possible_items)
|
||||
/datum/objective/steal/New()
|
||||
..()
|
||||
if(!GLOB.possible_items.len)//Only need to fill the list when it's needed.
|
||||
init_subtypes(/datum/objective_item/steal,GLOB.possible_items)
|
||||
for(var/I in subtypesof(/datum/objective_item/steal))
|
||||
new I
|
||||
|
||||
/datum/objective/steal/find_target()
|
||||
var/approved_targets = list()
|
||||
@@ -507,8 +508,8 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
/datum/objective/steal/special/New()
|
||||
..()
|
||||
if(!GLOB.possible_items_special.len)
|
||||
init_subtypes(/datum/objective_item/special,GLOB.possible_items_special)
|
||||
init_subtypes(/datum/objective_item/stack,GLOB.possible_items_special)
|
||||
for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack))
|
||||
new I
|
||||
|
||||
/datum/objective/steal/special/find_target()
|
||||
return set_target(pick(GLOB.possible_items_special))
|
||||
@@ -682,11 +683,11 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
|
||||
/datum/objective/steal_five_of_type/summon_guns
|
||||
explanation_text = "Steal at least five guns!"
|
||||
wanted_items = list(/obj/item/weapon/gun)
|
||||
wanted_items = list(/obj/item/gun)
|
||||
|
||||
/datum/objective/steal_five_of_type/summon_magic
|
||||
explanation_text = "Steal at least five magical artefacts!"
|
||||
wanted_items = list(/obj/item/weapon/spellbook, /obj/item/weapon/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/weapon/scrying, /obj/item/weapon/antag_spawner/contract, /obj/item/device/necromantic_stone)
|
||||
wanted_items = list(/obj/item/spellbook, /obj/item/gun/magic, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/scrying, /obj/item/antag_spawner/contract, /obj/item/device/necromantic_stone)
|
||||
|
||||
/datum/objective/steal_five_of_type/check_completion()
|
||||
if(!isliving(owner.current))
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
/datum/objective_item
|
||||
var/name = "A silly bike horn! Honk!"
|
||||
var/targetitem = /obj/item/weapon/bikehorn //typepath of the objective item
|
||||
var/targetitem = /obj/item/bikehorn //typepath of the objective item
|
||||
var/difficulty = 9001 //vaguely how hard it is to do this objective
|
||||
var/list/excludefromjob = list() //If you don't want a job to get a certain objective (no captain stealing his own medal, etcetc)
|
||||
var/list/altitems = list() //Items which can serve as an alternative to the objective (darn you blueprints)
|
||||
@@ -11,27 +11,41 @@
|
||||
/datum/objective_item/proc/check_special_completion() //for objectives with special checks (is that slime extract unused? does that intellicard have an ai in it? etcetc)
|
||||
return 1
|
||||
|
||||
/datum/objective_item/proc/TargetExists()
|
||||
return TRUE
|
||||
|
||||
/datum/objective_item/steal/New()
|
||||
..()
|
||||
if(TargetExists())
|
||||
GLOB.possible_items += src
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/datum/objective_item/steal/Destroy()
|
||||
GLOB.possible_items -= src
|
||||
return ..()
|
||||
|
||||
/datum/objective_item/steal/caplaser
|
||||
name = "the captain's antique laser gun."
|
||||
targetitem = /obj/item/weapon/gun/energy/laser/captain
|
||||
targetitem = /obj/item/gun/energy/laser/captain
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
/datum/objective_item/steal/hoslaser
|
||||
name = "the head of security's personal laser gun."
|
||||
targetitem = /obj/item/weapon/gun/energy/e_gun/hos
|
||||
targetitem = /obj/item/gun/energy/e_gun/hos
|
||||
difficulty = 10
|
||||
excludefromjob = list("Head Of Security")
|
||||
|
||||
/datum/objective_item/steal/handtele
|
||||
name = "a hand teleporter."
|
||||
targetitem = /obj/item/weapon/hand_tele
|
||||
targetitem = /obj/item/hand_tele
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
/datum/objective_item/steal/jetpack
|
||||
name = "the Captain's jetpack."
|
||||
targetitem = /obj/item/weapon/tank/jetpack/oxygen/captain
|
||||
targetitem = /obj/item/tank/jetpack/oxygen/captain
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
@@ -49,13 +63,13 @@
|
||||
|
||||
/datum/objective_item/steal/hypo
|
||||
name = "the hypospray."
|
||||
targetitem = /obj/item/weapon/reagent_containers/hypospray/CMO
|
||||
targetitem = /obj/item/reagent_containers/hypospray/CMO
|
||||
difficulty = 5
|
||||
excludefromjob = list("Chief Medical Officer")
|
||||
|
||||
/datum/objective_item/steal/nukedisc
|
||||
name = "the nuclear authentication disk."
|
||||
targetitem = /obj/item/weapon/disk/nuclear
|
||||
targetitem = /obj/item/disk/nuclear
|
||||
difficulty = 5
|
||||
excludefromjob = list("Captain")
|
||||
|
||||
@@ -82,7 +96,7 @@
|
||||
difficulty = 15
|
||||
|
||||
/datum/objective_item/steal/nuke_core/New()
|
||||
special_equipment += /obj/item/weapon/storage/box/syndie_kit/nuke
|
||||
special_equipment += /obj/item/storage/box/syndie_kit/nuke
|
||||
..()
|
||||
|
||||
/datum/objective_item/steal/supermatter
|
||||
@@ -91,17 +105,20 @@
|
||||
difficulty = 15
|
||||
|
||||
/datum/objective_item/steal/supermatter/New()
|
||||
special_equipment += /obj/item/weapon/storage/box/syndie_kit/supermatter
|
||||
special_equipment += /obj/item/storage/box/syndie_kit/supermatter
|
||||
..()
|
||||
|
||||
/datum/objective_item/steal/supermatter/TargetExists()
|
||||
return GLOB.main_supermatter_engine != null
|
||||
|
||||
//Items with special checks!
|
||||
/datum/objective_item/steal/plasma
|
||||
name = "28 moles of plasma (full tank)."
|
||||
targetitem = /obj/item/weapon/tank
|
||||
targetitem = /obj/item/tank
|
||||
difficulty = 3
|
||||
excludefromjob = list("Chief Engineer","Research Director","Station Engineer","Scientist","Atmospheric Technician")
|
||||
|
||||
/datum/objective_item/steal/plasma/check_special_completion(obj/item/weapon/tank/T)
|
||||
/datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T)
|
||||
var/target_amount = text2num(name)
|
||||
var/found_amount = 0
|
||||
found_amount += T.air_contents.gases["plasma"] ? T.air_contents.gases["plasma"][MOLES] : 0
|
||||
@@ -124,13 +141,13 @@
|
||||
targetitem = /obj/item/areaeditor/blueprints
|
||||
difficulty = 10
|
||||
excludefromjob = list("Chief Engineer")
|
||||
altitems = list(/obj/item/weapon/photo)
|
||||
altitems = list(/obj/item/photo)
|
||||
|
||||
/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
|
||||
if(istype(I, /obj/item/areaeditor/blueprints))
|
||||
return 1
|
||||
if(istype(I, /obj/item/weapon/photo))
|
||||
var/obj/item/weapon/photo/P = I
|
||||
if(istype(I, /obj/item/photo))
|
||||
var/obj/item/photo/P = I
|
||||
if(P.blueprints) //if the blueprints are in frame
|
||||
return 1
|
||||
return 0
|
||||
@@ -157,30 +174,41 @@
|
||||
targetitem = /obj/item/documents/syndicate/blue
|
||||
difficulty = 10
|
||||
|
||||
/datum/objective_item/special/New()
|
||||
..()
|
||||
if(TargetExists())
|
||||
GLOB.possible_items_special += src
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/datum/objective_item/special/Destroy()
|
||||
GLOB.possible_items_special -= src
|
||||
return ..()
|
||||
|
||||
//Old ninja objectives.
|
||||
/datum/objective_item/special/pinpointer
|
||||
name = "the captain's pinpointer."
|
||||
targetitem = /obj/item/weapon/pinpointer
|
||||
targetitem = /obj/item/pinpointer
|
||||
difficulty = 10
|
||||
|
||||
/datum/objective_item/special/aegun
|
||||
name = "an advanced energy gun."
|
||||
targetitem = /obj/item/weapon/gun/energy/e_gun/nuclear
|
||||
targetitem = /obj/item/gun/energy/e_gun/nuclear
|
||||
difficulty = 10
|
||||
|
||||
/datum/objective_item/special/ddrill
|
||||
name = "a diamond drill."
|
||||
targetitem = /obj/item/weapon/pickaxe/drill/diamonddrill
|
||||
targetitem = /obj/item/pickaxe/drill/diamonddrill
|
||||
difficulty = 10
|
||||
|
||||
/datum/objective_item/special/boh
|
||||
name = "a bag of holding."
|
||||
targetitem = /obj/item/weapon/storage/backpack/holding
|
||||
targetitem = /obj/item/storage/backpack/holding
|
||||
difficulty = 10
|
||||
|
||||
/datum/objective_item/special/hypercell
|
||||
name = "a hyper-capacity power cell."
|
||||
targetitem = /obj/item/weapon/stock_parts/cell/hyper
|
||||
targetitem = /obj/item/stock_parts/cell/hyper
|
||||
difficulty = 5
|
||||
|
||||
/datum/objective_item/special/laserpointer
|
||||
@@ -190,9 +218,20 @@
|
||||
|
||||
/datum/objective_item/special/corgimeat
|
||||
name = "a piece of corgi meat."
|
||||
targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
|
||||
targetitem = /obj/item/reagent_containers/food/snacks/meat/slab/corgi
|
||||
difficulty = 5
|
||||
|
||||
/datum/objective_item/stack/New()
|
||||
..()
|
||||
if(TargetExists())
|
||||
GLOB.possible_items_special += src
|
||||
else
|
||||
qdel(src)
|
||||
|
||||
/datum/objective_item/stack/Destroy()
|
||||
GLOB.possible_items_special -= src
|
||||
return ..()
|
||||
|
||||
//Stack objectives get their own subtype
|
||||
/datum/objective_item/stack
|
||||
name = "5 cardboard."
|
||||
|
||||
@@ -26,23 +26,23 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
var/hsbinfo = null
|
||||
//items that shouldn't spawn on the floor because they would bug or act weird
|
||||
var/global/list/spawn_forbidden = list(
|
||||
/obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you
|
||||
/obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you
|
||||
/obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
|
||||
/obj/item/device/uplink, /obj/item/smallDelivery, /obj/item/projectile,
|
||||
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/weapon/robot_module)
|
||||
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module)
|
||||
|
||||
/datum/hSB/proc/update()
|
||||
var/global/list/hrefs = list(
|
||||
"Space Gear",
|
||||
"Suit Up (Space Travel Gear)" = "hsbsuit",
|
||||
"Spawn Gas Mask" = "hsbspawn&path=[/obj/item/clothing/mask/gas]",
|
||||
"Spawn Emergency Air Tank" = "hsbspawn&path=[/obj/item/weapon/tank/internals/emergency_oxygen/double]",
|
||||
"Spawn Emergency Air Tank" = "hsbspawn&path=[/obj/item/tank/internals/emergency_oxygen/double]",
|
||||
|
||||
"Standard Tools",
|
||||
"Spawn Flashlight" = "hsbspawn&path=[/obj/item/device/flashlight]",
|
||||
"Spawn Toolbox" = "hsbspawn&path=[/obj/item/weapon/storage/toolbox/mechanical]",
|
||||
"Spawn Toolbox" = "hsbspawn&path=[/obj/item/storage/toolbox/mechanical]",
|
||||
"Spawn Light Replacer" = "hsbspawn&path=[/obj/item/device/lightreplacer]",
|
||||
"Spawn Medical Kit" = "hsbspawn&path=[/obj/item/weapon/storage/firstaid/regular]",
|
||||
"Spawn Medical Kit" = "hsbspawn&path=[/obj/item/storage/firstaid/regular]",
|
||||
"Spawn All-Access ID" = "hsbaaid",
|
||||
|
||||
"Building Supplies",
|
||||
@@ -52,10 +52,10 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
"Spawn 50 Reinforced Glass" = "hsbrglass",
|
||||
"Spawn 50 Glass" = "hsbglass",
|
||||
"Spawn Full Cable Coil" = "hsbspawn&path=[/obj/item/stack/cable_coil]",
|
||||
"Spawn Hyper Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/stock_parts/cell/hyper]",
|
||||
"Spawn Inf. Capacity Power Cell" = "hsbspawn&path=[/obj/item/weapon/stock_parts/cell/infinite]",
|
||||
"Spawn Hyper Capacity Power Cell" = "hsbspawn&path=[/obj/item/stock_parts/cell/hyper]",
|
||||
"Spawn Inf. Capacity Power Cell" = "hsbspawn&path=[/obj/item/stock_parts/cell/infinite]",
|
||||
"Spawn Rapid Construction Device" = "hsbrcd",
|
||||
"Spawn RCD Ammo" = "hsb_safespawn&path=[/obj/item/weapon/rcd_ammo]",
|
||||
"Spawn RCD Ammo" = "hsb_safespawn&path=[/obj/item/rcd_ammo]",
|
||||
"Spawn Airlock" = "hsbairlock",
|
||||
|
||||
"Miscellaneous",
|
||||
@@ -171,7 +171,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
P.back.layer = initial(P.back.layer)
|
||||
P.back.plane = initial(P.back.plane)
|
||||
P.back = null
|
||||
P.back = new/obj/item/weapon/tank/jetpack/oxygen(P)
|
||||
P.back = new/obj/item/tank/jetpack/oxygen(P)
|
||||
P.back.layer = ABOVE_HUD_LAYER
|
||||
P.back.plane = ABOVE_HUD_PLANE
|
||||
P.update_inv_back()
|
||||
@@ -205,7 +205,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
// All access ID
|
||||
//
|
||||
if("hsbaaid")
|
||||
var/obj/item/weapon/card/id/gold/ID = new(usr.loc)
|
||||
var/obj/item/card/id/gold/ID = new(usr.loc)
|
||||
ID.registered_name = usr.real_name
|
||||
ID.assignment = "Sandbox"
|
||||
ID.access = get_all_accesses()
|
||||
@@ -218,7 +218,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
if("hsbrcd")
|
||||
if(!GLOB.hsboxspawn) return
|
||||
|
||||
new/obj/item/weapon/construction/rcd/combat(usr.loc)
|
||||
new/obj/item/construction/rcd/combat(usr.loc)
|
||||
|
||||
//
|
||||
// New sandbox airlock maker
|
||||
@@ -250,7 +250,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
|
||||
if(!reaginfo)
|
||||
reaginfo = "<b>Reagent Containers</b> <a href='?\ref[src];hsb=hsbcloth'>(Clothing)</a> <a href='?\ref[src];hsb=hsbobj'>(Other Items)</a><hr><br>"
|
||||
var/list/all_items = subtypesof(/obj/item/weapon/reagent_containers)
|
||||
var/list/all_items = subtypesof(/obj/item/reagent_containers)
|
||||
for(var/typekey in spawn_forbidden)
|
||||
all_items -= typesof(typekey)
|
||||
for(var/O in reverseRange(all_items))
|
||||
@@ -264,7 +264,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
|
||||
if(!objinfo)
|
||||
objinfo = "<b>Other Items</b> <a href='?\ref[src];hsb=hsbcloth'>(Clothing)</a> <a href='?\ref[src];hsb=hsbreag'>(Reagent Containers)</a><hr><br>"
|
||||
var/list/all_items = subtypesof(/obj/item/) - typesof(/obj/item/clothing) - typesof(/obj/item/weapon/reagent_containers)
|
||||
var/list/all_items = subtypesof(/obj/item/) - typesof(/obj/item/clothing) - typesof(/obj/item/reagent_containers)
|
||||
for(var/typekey in spawn_forbidden)
|
||||
all_items -= typesof(typekey)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
///////////////////////////Veil Render//////////////////////
|
||||
|
||||
/obj/item/weapon/veilrender
|
||||
/obj/item/veilrender
|
||||
name = "veil render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast city."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
@@ -20,7 +20,7 @@
|
||||
var/rend_desc = "You should run now."
|
||||
var/spawn_fast = 0 //if 1, ignores checking for mobs on loc before spawning
|
||||
|
||||
/obj/item/weapon/veilrender/attack_self(mob/user)
|
||||
/obj/item/veilrender/attack_self(mob/user)
|
||||
if(charges > 0)
|
||||
new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
|
||||
charges--
|
||||
@@ -57,14 +57,14 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/rend/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/nullrod))
|
||||
if(istype(I, /obj/item/nullrod))
|
||||
user.visible_message("<span class='danger'>[user] seals \the [src] with \the [I].</span>")
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/veilrender/vealrender
|
||||
/obj/item/veilrender/vealrender
|
||||
name = "veal render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
|
||||
spawn_type = /mob/living/simple_animal/cow
|
||||
@@ -72,7 +72,7 @@
|
||||
activate_descriptor = "hunger"
|
||||
rend_desc = "Reverberates with the sound of ten thousand moos."
|
||||
|
||||
/obj/item/weapon/veilrender/honkrender
|
||||
/obj/item/veilrender/honkrender
|
||||
name = "honk render"
|
||||
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus."
|
||||
spawn_type = /mob/living/simple_animal/hostile/retaliate/clown
|
||||
@@ -101,7 +101,7 @@
|
||||
return
|
||||
/////////////////////////////////////////Scrying///////////////////
|
||||
|
||||
/obj/item/weapon/scrying
|
||||
/obj/item/scrying
|
||||
name = "scrying orb"
|
||||
desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
|
||||
icon = 'icons/obj/projectiles.dmi'
|
||||
@@ -113,7 +113,7 @@
|
||||
force = 15
|
||||
hitsound = 'sound/items/welder2.ogg'
|
||||
|
||||
/obj/item/weapon/scrying/attack_self(mob/user)
|
||||
/obj/item/scrying/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You can see...everything!</span>")
|
||||
visible_message("<span class='danger'>[user] stares into [src], their eyes glazing over.</span>")
|
||||
user.ghostize(1)
|
||||
@@ -191,24 +191,24 @@
|
||||
H.equip_to_slot_or_del(new hat(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
|
||||
H.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(H))
|
||||
H.put_in_hands_or_del(new /obj/item/weapon/claymore(H))
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/twohanded/spear(H), slot_back)
|
||||
H.put_in_hands_or_del(new /obj/item/shield/riot/roman(H))
|
||||
H.put_in_hands_or_del(new /obj/item/claymore(H))
|
||||
H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
|
||||
|
||||
|
||||
|
||||
/////////////////////Multiverse Blade////////////////////
|
||||
|
||||
/obj/item/weapon/multisword
|
||||
/obj/item/multisword
|
||||
name = "multiverse sword"
|
||||
desc = "A weapon capable of conquering the universe and beyond. Activate it to summon copies of yourself from others dimensions to fight by your side."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "multiverse"
|
||||
item_state = "multiverse"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
flags = CONDUCT
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
sharpness = IS_SHARP
|
||||
force = 20
|
||||
@@ -220,16 +220,16 @@
|
||||
var/assigned = "unassigned"
|
||||
var/static/list/multiverse = list()
|
||||
|
||||
/obj/item/weapon/multisword/New()
|
||||
/obj/item/multisword/New()
|
||||
..()
|
||||
multiverse += src
|
||||
|
||||
|
||||
/obj/item/weapon/multisword/Destroy()
|
||||
/obj/item/multisword/Destroy()
|
||||
multiverse.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/multisword/attack_self(mob/user)
|
||||
/obj/item/multisword/attack_self(mob/user)
|
||||
if(user.mind.special_role == "apprentice")
|
||||
to_chat(user, "<span class='warning'>You know better than to touch your teacher's stuff.</span>")
|
||||
return
|
||||
@@ -265,7 +265,7 @@
|
||||
spawn_copy(C, get_turf(user.loc), user)
|
||||
to_chat(user, "<span class='warning'><B>The sword flashes, and you find yourself face to face with...you!</B></span>")
|
||||
cooldown = world.time + 400
|
||||
for(var/obj/item/weapon/multisword/M in multiverse)
|
||||
for(var/obj/item/multisword/M in multiverse)
|
||||
if(M.assigned == assigned)
|
||||
M.cooldown = cooldown
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
to_chat(user, "<span class='warning'><B>[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies.</span>")
|
||||
|
||||
|
||||
/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user)
|
||||
/obj/item/multisword/proc/spawn_copy(var/client/C, var/turf/T, mob/user)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M, icon_updates=0)
|
||||
M.key = C.key
|
||||
@@ -298,9 +298,9 @@
|
||||
M.dna.update_dna_identity()
|
||||
equip_copy(M)
|
||||
|
||||
/obj/item/weapon/multisword/proc/equip_copy(var/mob/living/carbon/human/M)
|
||||
/obj/item/multisword/proc/equip_copy(var/mob/living/carbon/human/M)
|
||||
|
||||
var/obj/item/weapon/multisword/sword = new /obj/item/weapon/multisword
|
||||
var/obj/item/multisword/sword = new /obj/item/multisword
|
||||
sword.assigned = assigned
|
||||
sword.faction = list("[assigned]")
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
M.equip_to_slot_or_del(new hat(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/roman(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(M), slot_shoes)
|
||||
M.put_in_hands_or_del(new /obj/item/weapon/shield/riot/roman(M))
|
||||
M.put_in_hands_or_del(new /obj/item/shield/riot/roman(M))
|
||||
M.put_in_hands_or_del(sword)
|
||||
|
||||
if("wizard")
|
||||
@@ -380,7 +380,7 @@
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/bikehorn(M), slot_l_store)
|
||||
M.put_in_hands_or_del(sword)
|
||||
|
||||
if("killer")
|
||||
@@ -391,8 +391,8 @@
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_ears)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/kitchen/knife(M), slot_l_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/scalpel(M), slot_r_store)
|
||||
M.put_in_hands_or_del(sword)
|
||||
for(var/obj/item/carried_item in M.get_equipped_items())
|
||||
carried_item.add_mob_blood(M)
|
||||
@@ -439,7 +439,7 @@
|
||||
|
||||
M.update_body_parts()
|
||||
|
||||
var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id
|
||||
var/obj/item/card/id/W = new /obj/item/card/id
|
||||
W.icon_state = "centcom"
|
||||
W.access += ACCESS_MAINT_TUNNELS
|
||||
W.assignment = "Multiverse Traveller"
|
||||
@@ -474,7 +474,7 @@
|
||||
to_chat(target, "<span class='userdanger'>You feel a stabbing pain in [parse_zone(user.zone_selected)]!</span>")
|
||||
target.Knockdown(40)
|
||||
GiveHint(target)
|
||||
else if(istype(I, /obj/item/weapon/bikehorn))
|
||||
else if(istype(I, /obj/item/bikehorn))
|
||||
to_chat(target, "<span class='userdanger'>HONK</span>")
|
||||
SEND_SOUND(target, 'sound/items/airhorn.ogg')
|
||||
target.adjustEarDamage(0,3)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/datum/spellbook_entry/proc/IsAvailible() // For config prefs / gamemode restrictions - these are round applied
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) // Specific circumstances
|
||||
/datum/spellbook_entry/proc/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book) // Specific circumstances
|
||||
if(book.uses<cost || limit == 0)
|
||||
return 0
|
||||
for(var/spell in user.mind.spell_list)
|
||||
@@ -27,7 +27,7 @@
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return 1 on success
|
||||
/datum/spellbook_entry/proc/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success
|
||||
if(!S || QDELETED(S))
|
||||
S = new spell_type()
|
||||
//Check if we got the spell already
|
||||
@@ -65,7 +65,7 @@
|
||||
to_chat(user, "<span class='notice'>You have learned [S.name].</span>")
|
||||
return 1
|
||||
|
||||
/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/proc/CanRefund(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
if(!refundable)
|
||||
return 0
|
||||
if(!S)
|
||||
@@ -75,7 +75,7 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return point value or -1 for failure
|
||||
/datum/spellbook_entry/proc/Refund(mob/living/carbon/human/user,obj/item/spellbook/book) //return point value or -1 for failure
|
||||
var/area/wizard_station/A = locate() in GLOB.sortedAreas
|
||||
if(!(user in A.contents))
|
||||
to_chat(user, "<span class='warning'>You can only refund spells at the wizard lair</span>")
|
||||
@@ -211,9 +211,9 @@
|
||||
spell_type = /obj/effect/proc_holder/spell/aimed/lightningbolt
|
||||
cost = 3
|
||||
|
||||
/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book) //return 1 on success
|
||||
/datum/spellbook_entry/lightningbolt/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) //return 1 on success
|
||||
. = ..()
|
||||
SET_SECONDARY_FLAG(user, TESLA_IGNORE)
|
||||
user.flags_2 |= TESLA_IGNORE_2
|
||||
|
||||
/datum/spellbook_entry/infinite_guns
|
||||
name = "Lesser Summon Guns"
|
||||
@@ -263,7 +263,7 @@
|
||||
var/item_path= null
|
||||
|
||||
|
||||
/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
new item_path(get_turf(user))
|
||||
SSblackbox.add_details("wizard_spell_learned", name)
|
||||
return 1
|
||||
@@ -280,45 +280,45 @@
|
||||
/datum/spellbook_entry/item/staffchange
|
||||
name = "Staff of Change"
|
||||
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/change
|
||||
item_path = /obj/item/gun/magic/staff/change
|
||||
|
||||
/datum/spellbook_entry/item/staffanimation
|
||||
name = "Staff of Animation"
|
||||
desc = "An arcane staff capable of shooting bolts of eldritch energy which cause inanimate objects to come to life. This magic doesn't affect machines."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/animate
|
||||
item_path = /obj/item/gun/magic/staff/animate
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/staffchaos
|
||||
name = "Staff of Chaos"
|
||||
desc = "A caprious tool that can fire all sorts of magic without any rhyme or reason. Using it on people you care about is not recommended."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/chaos
|
||||
item_path = /obj/item/gun/magic/staff/chaos
|
||||
|
||||
/datum/spellbook_entry/item/spellblade
|
||||
name = "Spellblade"
|
||||
desc = "A sword capable of firing blasts of energy which rip targets limb from limb."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/spellblade
|
||||
item_path = /obj/item/gun/magic/staff/spellblade
|
||||
|
||||
/datum/spellbook_entry/item/staffdoor
|
||||
name = "Staff of Door Creation"
|
||||
desc = "A particular staff that can mold solid metal into ornate doors. Useful for getting around in the absence of other transportation. Does not work on glass."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/door
|
||||
item_path = /obj/item/gun/magic/staff/door
|
||||
cost = 1
|
||||
category = "Mobility"
|
||||
|
||||
/datum/spellbook_entry/item/staffhealing
|
||||
name = "Staff of Healing"
|
||||
desc = "An altruistic staff that can heal the lame and raise the dead."
|
||||
item_path = /obj/item/weapon/gun/magic/staff/healing
|
||||
item_path = /obj/item/gun/magic/staff/healing
|
||||
cost = 1
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/scryingorb
|
||||
name = "Scrying Orb"
|
||||
desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to spy upon the station with ease. In addition, buying it will permanently grant you x-ray vision."
|
||||
item_path = /obj/item/weapon/scrying
|
||||
item_path = /obj/item/scrying
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/scryingorb/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/item/scryingorb/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
if(..())
|
||||
if (!(user.dna.check_mutation(XRAY)))
|
||||
user.dna.add_mutation(XRAY)
|
||||
@@ -327,10 +327,10 @@
|
||||
/datum/spellbook_entry/item/soulstones
|
||||
name = "Six Soul Stone Shards and the spell Artificer"
|
||||
desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
|
||||
item_path = /obj/item/weapon/storage/belt/soulstone/full
|
||||
item_path = /obj/item/storage/belt/soulstone/full
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
. =..()
|
||||
if(.)
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null))
|
||||
@@ -345,7 +345,7 @@
|
||||
/datum/spellbook_entry/item/wands
|
||||
name = "Wand Assortment"
|
||||
desc = "A collection of wands that allow for a wide variety of utility. Wands have a limited number of charges, so be conservative in use. Comes in a handy belt."
|
||||
item_path = /obj/item/weapon/storage/belt/wands/full
|
||||
item_path = /obj/item/storage/belt/wands/full
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/armor
|
||||
@@ -354,7 +354,7 @@
|
||||
item_path = /obj/item/clothing/suit/space/hardsuit/wizard
|
||||
category = "Defensive"
|
||||
|
||||
/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
. = ..()
|
||||
if(.)
|
||||
new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them.
|
||||
@@ -363,25 +363,25 @@
|
||||
/datum/spellbook_entry/item/contract
|
||||
name = "Contract of Apprenticeship"
|
||||
desc = "A magical contract binding an apprentice wizard to your service, using it will summon them to your side."
|
||||
item_path = /obj/item/weapon/antag_spawner/contract
|
||||
item_path = /obj/item/antag_spawner/contract
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/guardian
|
||||
name = "Guardian Deck"
|
||||
desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \
|
||||
It would be wise to avoid buying these with anything capable of causing you to swap bodies with others."
|
||||
item_path = /obj/item/weapon/guardiancreator/choose/wizard
|
||||
item_path = /obj/item/guardiancreator/choose/wizard
|
||||
category = "Assistance"
|
||||
|
||||
/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/item/guardian/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
. = ..()
|
||||
if(.)
|
||||
new /obj/item/weapon/paper/guides/antag/guardian/wizard(get_turf(user))
|
||||
new /obj/item/paper/guides/antag/guardian/wizard(get_turf(user))
|
||||
|
||||
/datum/spellbook_entry/item/bloodbottle
|
||||
name = "Bottle of Blood"
|
||||
desc = "A bottle of magically infused blood, the smell of which will attract extradimensional beings when broken. Be careful though, the kinds of creatures summoned by blood magic are indiscriminate in their killing, and you yourself may become a victim."
|
||||
item_path = /obj/item/weapon/antag_spawner/slaughter_demon
|
||||
item_path = /obj/item/antag_spawner/slaughter_demon
|
||||
limit = 3
|
||||
category = "Assistance"
|
||||
|
||||
@@ -394,7 +394,7 @@
|
||||
to be released on the demon's death. Chaotic, but not ultimately \
|
||||
damaging. The crew's reaction to the other hand could be very \
|
||||
destructive."
|
||||
item_path = /obj/item/weapon/antag_spawner/slaughter_demon/laughter
|
||||
item_path = /obj/item/antag_spawner/slaughter_demon/laughter
|
||||
cost = 1 //non-destructive; it's just a jape, sibling!
|
||||
limit = 3
|
||||
category = "Assistance"
|
||||
@@ -402,12 +402,12 @@
|
||||
/datum/spellbook_entry/item/mjolnir
|
||||
name = "Mjolnir"
|
||||
desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
|
||||
item_path = /obj/item/weapon/twohanded/mjollnir
|
||||
item_path = /obj/item/twohanded/mjollnir
|
||||
|
||||
/datum/spellbook_entry/item/singularity_hammer
|
||||
name = "Singularity Hammer"
|
||||
desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact."
|
||||
item_path = /obj/item/weapon/twohanded/singularityhammer
|
||||
item_path = /obj/item/twohanded/singularityhammer
|
||||
|
||||
/datum/spellbook_entry/item/battlemage
|
||||
name = "Battlemage Armour"
|
||||
@@ -437,7 +437,7 @@
|
||||
buy_word = "Cast"
|
||||
var/active = 0
|
||||
|
||||
/datum/spellbook_entry/summon/CanBuy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/summon/CanBuy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
return ..() && !active
|
||||
|
||||
/datum/spellbook_entry/summon/GetInfo()
|
||||
@@ -463,7 +463,7 @@
|
||||
else
|
||||
return TRUE
|
||||
|
||||
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/summon/ghosts/Buy(mob/living/carbon/human/user, obj/item/spellbook/book)
|
||||
SSblackbox.add_details("wizard_spell_learned", name)
|
||||
new /datum/round_event/wizard/ghost()
|
||||
active = TRUE
|
||||
@@ -480,7 +480,7 @@
|
||||
return 0
|
||||
return (!config.no_summon_guns)
|
||||
|
||||
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.add_details("wizard_spell_learned", name)
|
||||
rightandwrong(0, user, 25)
|
||||
active = 1
|
||||
@@ -497,7 +497,7 @@
|
||||
return 0
|
||||
return (!config.no_summon_magic)
|
||||
|
||||
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.add_details("wizard_spell_learned", name)
|
||||
rightandwrong(1, user, 25)
|
||||
active = 1
|
||||
@@ -515,7 +515,7 @@
|
||||
return 0
|
||||
return (!config.no_summon_events)
|
||||
|
||||
/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/weapon/spellbook/book)
|
||||
/datum/spellbook_entry/summon/events/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
|
||||
SSblackbox.add_details("wizard_spell_learned", name)
|
||||
summonevents()
|
||||
times++
|
||||
@@ -529,7 +529,7 @@
|
||||
. += "You cast it [times] times.<br>"
|
||||
return .
|
||||
|
||||
/obj/item/weapon/spellbook
|
||||
/obj/item/spellbook
|
||||
name = "spell book"
|
||||
desc = "An unearthly tome that glows with power."
|
||||
icon = 'icons/obj/library.dmi'
|
||||
@@ -537,7 +537,7 @@
|
||||
throw_speed = 2
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
persistence_replacement = /obj/item/weapon/spellbook/oneuse/random
|
||||
persistence_replacement = /obj/item/spellbook/oneuse/random
|
||||
var/uses = 10
|
||||
var/temp = null
|
||||
var/tab = null
|
||||
@@ -545,18 +545,18 @@
|
||||
var/list/datum/spellbook_entry/entries = list()
|
||||
var/list/categories = list()
|
||||
|
||||
/obj/item/weapon/spellbook/examine(mob/user)
|
||||
/obj/item/spellbook/examine(mob/user)
|
||||
..()
|
||||
if(owner)
|
||||
to_chat(user, "There is a small signature on the front cover: \"[owner]\".")
|
||||
else
|
||||
to_chat(user, "It appears to have no author.")
|
||||
|
||||
/obj/item/weapon/spellbook/Initialize()
|
||||
/obj/item/spellbook/Initialize()
|
||||
..()
|
||||
prepare_spells()
|
||||
|
||||
/obj/item/weapon/spellbook/proc/prepare_spells()
|
||||
/obj/item/spellbook/proc/prepare_spells()
|
||||
var/entry_types = subtypesof(/datum/spellbook_entry) - /datum/spellbook_entry/item - /datum/spellbook_entry/summon
|
||||
for(var/T in entry_types)
|
||||
var/datum/spellbook_entry/E = new T
|
||||
@@ -567,9 +567,9 @@
|
||||
qdel(E)
|
||||
tab = categories[1]
|
||||
|
||||
/obj/item/weapon/spellbook/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/weapon/antag_spawner/contract))
|
||||
var/obj/item/weapon/antag_spawner/contract/contract = O
|
||||
/obj/item/spellbook/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/antag_spawner/contract))
|
||||
var/obj/item/antag_spawner/contract/contract = O
|
||||
if(contract.used)
|
||||
to_chat(user, "<span class='warning'>The contract has been used, you can't get your points back now!</span>")
|
||||
else
|
||||
@@ -579,7 +579,7 @@
|
||||
if(!isnull(CT.limit))
|
||||
CT.limit++
|
||||
qdel(O)
|
||||
else if(istype(O, /obj/item/weapon/antag_spawner/slaughter_demon))
|
||||
else if(istype(O, /obj/item/antag_spawner/slaughter_demon))
|
||||
to_chat(user, "<span class='notice'>On second thought, maybe summoning a demon is a bad idea. You refund your points.</span>")
|
||||
uses++
|
||||
for(var/datum/spellbook_entry/item/bloodbottle/BB in entries)
|
||||
@@ -587,7 +587,7 @@
|
||||
BB.limit++
|
||||
qdel(O)
|
||||
|
||||
/obj/item/weapon/spellbook/proc/GetCategoryHeader(category)
|
||||
/obj/item/spellbook/proc/GetCategoryHeader(category)
|
||||
var/dat = ""
|
||||
switch(category)
|
||||
if("Offensive")
|
||||
@@ -617,7 +617,7 @@
|
||||
dat += "These powerful spells change the very fabric of reality. Not always in your favour.<BR>"
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/spellbook/proc/wrap(content)
|
||||
/obj/item/spellbook/proc/wrap(content)
|
||||
var/dat = ""
|
||||
dat +="<html><head><title>Spellbook</title></head>"
|
||||
dat += {"
|
||||
@@ -637,7 +637,7 @@
|
||||
dat += {"[content]</body></html>"}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/spellbook/attack_self(mob/user)
|
||||
/obj/item/spellbook/attack_self(mob/user)
|
||||
if(!owner)
|
||||
to_chat(user, "<span class='notice'>You bind the spellbook to yourself.</span>")
|
||||
owner = user
|
||||
@@ -682,7 +682,7 @@
|
||||
onclose(user, "spellbook")
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/Topic(href, href_list)
|
||||
/obj/item/spellbook/Topic(href, href_list)
|
||||
..()
|
||||
var/mob/living/carbon/human/H = usr
|
||||
|
||||
@@ -720,7 +720,7 @@
|
||||
|
||||
//Single Use Spellbooks//
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse
|
||||
/obj/item/spellbook/oneuse
|
||||
var/spell = /obj/effect/proc_holder/spell/targeted/projectile/magic_missile //just a placeholder to avoid runtimes if someone spawned the generic
|
||||
var/spellname = "sandbox"
|
||||
var/used = 0
|
||||
@@ -729,10 +729,10 @@
|
||||
desc = "This template spellbook was never meant for the eyes of man..."
|
||||
persistence_replacement = null
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/prepare_spells()
|
||||
/obj/item/spellbook/oneuse/prepare_spells()
|
||||
name += spellname
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/attack_self(mob/user)
|
||||
/obj/item/spellbook/oneuse/attack_self(mob/user)
|
||||
var/obj/effect/proc_holder/spell/S = new spell
|
||||
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
|
||||
if(knownspell.type == S.type)
|
||||
@@ -750,37 +750,37 @@
|
||||
user.log_message("<font color='orange'>learned the spell [spellname] ([S]).</font>", INDIVIDUAL_ATTACK_LOG)
|
||||
onlearned(user)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/proc/recoil(mob/user)
|
||||
user.visible_message("<span class='warning'>[src] glows in a black light!</span>")
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/proc/onlearned(mob/user)
|
||||
/obj/item/spellbook/oneuse/proc/onlearned(mob/user)
|
||||
used = 1
|
||||
user.visible_message("<span class='caution'>[src] glows dark for a second!</span>")
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/attackby()
|
||||
/obj/item/spellbook/oneuse/attackby()
|
||||
return
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fireball
|
||||
/obj/item/spellbook/oneuse/fireball
|
||||
spell = /obj/effect/proc_holder/spell/aimed/fireball
|
||||
spellname = "fireball"
|
||||
icon_state ="bookfireball"
|
||||
desc = "This book feels warm to the touch."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/fireball/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/fireball/recoil(mob/user)
|
||||
..()
|
||||
explosion(user.loc, -1, 0, 2, 3, 0, flame_range = 2)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/smoke
|
||||
/obj/item/spellbook/oneuse/smoke
|
||||
spell = /obj/effect/proc_holder/spell/targeted/smoke
|
||||
spellname = "smoke"
|
||||
icon_state ="booksmoke"
|
||||
desc = "This book is overflowing with the dank arts."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/smoke/lesser //Chaplain smoke book
|
||||
/obj/item/spellbook/oneuse/smoke/lesser //Chaplain smoke book
|
||||
spell = /obj/effect/proc_holder/spell/targeted/smoke/lesser
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/smoke/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/smoke/recoil(mob/user)
|
||||
..()
|
||||
to_chat(user,"<span class='caution'>Your stomach rumbles...</span>")
|
||||
if(user.nutrition)
|
||||
@@ -789,31 +789,31 @@
|
||||
user.nutrition = 0
|
||||
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/blind
|
||||
/obj/item/spellbook/oneuse/blind
|
||||
spell = /obj/effect/proc_holder/spell/targeted/trigger/blind
|
||||
spellname = "blind"
|
||||
icon_state ="bookblind"
|
||||
desc = "This book looks blurry, no matter how you look at it."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/blind/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/blind/recoil(mob/user)
|
||||
..()
|
||||
to_chat(user,"<span class='warning'>You go blind!</span>")
|
||||
user.blind_eyes(10)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap
|
||||
/obj/item/spellbook/oneuse/mindswap
|
||||
spell = /obj/effect/proc_holder/spell/targeted/mind_transfer
|
||||
spellname = "mindswap"
|
||||
icon_state ="bookmindswap"
|
||||
desc = "This book's cover is pristine, though its pages look ragged and torn."
|
||||
var/mob/stored_swap = null //Used in used book recoils to store an identity for mindswaps
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap/onlearned()
|
||||
/obj/item/spellbook/oneuse/mindswap/onlearned()
|
||||
spellname = pick("fireball","smoke","blind","forcewall","knock","barnyard","charge")
|
||||
icon_state = "book[spellname]"
|
||||
name = "spellbook of [spellname]" //Note, desc doesn't change by design
|
||||
..()
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/mindswap/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/mindswap/recoil(mob/user)
|
||||
..()
|
||||
if(stored_swap in GLOB.dead_mob_list)
|
||||
stored_swap = null
|
||||
@@ -832,40 +832,40 @@
|
||||
to_chat(user,"<span class='warning'>Suddenly you're staring at [src] again... where are you, who are you?!</span>")
|
||||
stored_swap = null
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall
|
||||
/obj/item/spellbook/oneuse/forcewall
|
||||
spell = /obj/effect/proc_holder/spell/targeted/forcewall
|
||||
spellname = "forcewall"
|
||||
icon_state ="bookforcewall"
|
||||
desc = "This book has a dedication to mimes everywhere inside the front cover."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/forcewall/recoil(mob/living/user)
|
||||
/obj/item/spellbook/oneuse/forcewall/recoil(mob/living/user)
|
||||
..()
|
||||
to_chat(user,"<span class='warning'>You suddenly feel very solid!</span>")
|
||||
user.Stun(40, ignore_canstun = TRUE)
|
||||
user.petrify(30)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/knock
|
||||
/obj/item/spellbook/oneuse/knock
|
||||
spell = /obj/effect/proc_holder/spell/aoe_turf/knock
|
||||
spellname = "knock"
|
||||
icon_state ="bookknock"
|
||||
desc = "This book is hard to hold closed properly."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/knock/recoil(mob/living/user)
|
||||
/obj/item/spellbook/oneuse/knock/recoil(mob/living/user)
|
||||
..()
|
||||
to_chat(user,"<span class='warning'>You're knocked down!</span>")
|
||||
user.Knockdown(40)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/barnyard
|
||||
/obj/item/spellbook/oneuse/barnyard
|
||||
spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse
|
||||
spellname = "barnyard"
|
||||
icon_state ="bookhorses"
|
||||
desc = "This book is more horse than your mind has room for."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user)
|
||||
/obj/item/spellbook/oneuse/barnyard/recoil(mob/living/carbon/user)
|
||||
if(ishuman(user))
|
||||
to_chat(user,"<font size='15' color='red'><b>HOR-SIE HAS RISEN</b></font>")
|
||||
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
|
||||
magichead.flags |= NODROP //curses!
|
||||
magichead.flags_1 |= NODROP_1 //curses!
|
||||
magichead.flags_inv &= ~HIDEFACE //so you can still see their face
|
||||
magichead.voicechange = 1 //NEEEEIIGHH
|
||||
if(!user.dropItemToGround(user.wear_mask))
|
||||
@@ -875,36 +875,36 @@
|
||||
else
|
||||
to_chat(user,"<span class='notice'>I say thee neigh</span>") //It still lives here
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/charge
|
||||
/obj/item/spellbook/oneuse/charge
|
||||
spell = /obj/effect/proc_holder/spell/targeted/charge
|
||||
spellname = "charging"
|
||||
icon_state ="bookcharge"
|
||||
desc = "This book is made of 100% post-consumer wizard."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/charge/recoil(mob/user)
|
||||
..()
|
||||
to_chat(user,"<span class='warning'>[src] suddenly feels very warm!</span>")
|
||||
empulse(src, 1, 1)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/summonitem
|
||||
/obj/item/spellbook/oneuse/summonitem
|
||||
spell = /obj/effect/proc_holder/spell/targeted/summonitem
|
||||
spellname = "instant summons"
|
||||
icon_state ="booksummons"
|
||||
desc = "This book is bright and garish, very hard to miss."
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/summonitem/recoil(mob/user)
|
||||
/obj/item/spellbook/oneuse/summonitem/recoil(mob/user)
|
||||
..()
|
||||
to_chat(user,"<span class='warning'>[src] suddenly vanishes!</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/random/Initialize()
|
||||
/obj/item/spellbook/oneuse/random/Initialize()
|
||||
..()
|
||||
var/static/banned_spells = list(/obj/item/weapon/spellbook/oneuse/mimery_blockade, /obj/item/weapon/spellbook/oneuse/mimery_guns)
|
||||
var/real_type = pick(subtypesof(/obj/item/weapon/spellbook/oneuse) - banned_spells)
|
||||
var/static/banned_spells = list(/obj/item/spellbook/oneuse/mimery_blockade, /obj/item/spellbook/oneuse/mimery_guns)
|
||||
var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells)
|
||||
new real_type(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/spellbook/oneuse/sacredflame
|
||||
/obj/item/spellbook/oneuse/sacredflame
|
||||
spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
|
||||
spellname = "sacred flame"
|
||||
icon_state ="booksacredflame"
|
||||
|
||||
@@ -152,10 +152,10 @@
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(wizard_mob), slot_shoes)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(wizard_mob), slot_in_backpack)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store)
|
||||
var/obj/item/weapon/spellbook/spellbook = new /obj/item/weapon/spellbook(wizard_mob)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack(wizard_mob), slot_back)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/box/survival(wizard_mob), slot_in_backpack)
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store)
|
||||
var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob)
|
||||
spellbook.owner = wizard_mob
|
||||
wizard_mob.put_in_hands_or_del(spellbook)
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
idle_power_usage = 0
|
||||
var/obj/item/device/radio/beacon/Beacon
|
||||
|
||||
/obj/machinery/bluespace_beacon/New()
|
||||
..()
|
||||
/obj/machinery/bluespace_beacon/Initialize()
|
||||
. = ..()
|
||||
var/turf/T = loc
|
||||
Beacon = new /obj/item/device/radio/beacon
|
||||
Beacon.invisibility = INVISIBILITY_MAXIMUM
|
||||
@@ -21,9 +21,7 @@
|
||||
hide(T.intact)
|
||||
|
||||
/obj/machinery/bluespace_beacon/Destroy()
|
||||
if(Beacon)
|
||||
qdel(Beacon)
|
||||
Beacon = null
|
||||
QDEL_NULL(Beacon)
|
||||
return ..()
|
||||
|
||||
// update the invisibility and icon
|
||||
|
||||
@@ -27,12 +27,16 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/pdapainter/New()
|
||||
..()
|
||||
var/blocked = list(/obj/item/device/pda/ai/pai, /obj/item/device/pda/ai, /obj/item/device/pda/heads,
|
||||
/obj/item/device/pda/clear, /obj/item/device/pda/syndicate)
|
||||
|
||||
for(var/P in typesof(/obj/item/device/pda)-blocked)
|
||||
/obj/machinery/pdapainter/Initialize()
|
||||
. = ..()
|
||||
var/list/blocked = list(
|
||||
/obj/item/device/pda/ai/pai,
|
||||
/obj/item/device/pda/ai,
|
||||
/obj/item/device/pda/heads,
|
||||
/obj/item/device/pda/clear,
|
||||
/obj/item/device/pda/syndicate)
|
||||
|
||||
for(var/P in typesof(/obj/item/device/pda) - blocked)
|
||||
var/obj/item/device/pda/D = new P
|
||||
|
||||
//D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
|
||||
@@ -41,9 +45,7 @@
|
||||
src.colorlist += D
|
||||
|
||||
/obj/machinery/pdapainter/Destroy()
|
||||
if(storedpda)
|
||||
qdel(storedpda)
|
||||
storedpda = null
|
||||
QDEL_NULL(storedpda)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/on_deconstruction()
|
||||
@@ -79,8 +81,8 @@
|
||||
P.add_fingerprint(user)
|
||||
update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weapon/weldingtool/WT = O
|
||||
else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weldingtool/WT = O
|
||||
if(stat & BROKEN)
|
||||
if(WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] is repairing [src].", \
|
||||
@@ -101,7 +103,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
state_open = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/sleeper
|
||||
var/efficiency = 1
|
||||
var/min_health = -25
|
||||
var/list/available_chems
|
||||
@@ -26,30 +27,17 @@
|
||||
var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: antitoxin -> morphine
|
||||
var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning
|
||||
|
||||
/obj/machinery/sleeper/New()
|
||||
..()
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/sleeper(null)
|
||||
B.apply_default_parts(src)
|
||||
/obj/machinery/sleeper/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
reset_chem_buttons()
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/sleeper
|
||||
name = "Sleeper (Machine Board)"
|
||||
build_path = /obj/machinery/sleeper
|
||||
origin_tech = "programming=3;biotech=2;engineering=3"
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/matter_bin = 1,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/stack/cable_coil = 1,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1,
|
||||
/obj/item/stack/sheet/glass = 1)
|
||||
|
||||
/obj/machinery/sleeper/RefreshParts()
|
||||
var/E
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts)
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
E += B.rating
|
||||
var/I
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
I += M.rating
|
||||
|
||||
efficiency = initial(efficiency)* E
|
||||
|
||||
@@ -35,8 +35,8 @@ Class Variables:
|
||||
Next uid value in sequence
|
||||
|
||||
stat (bitflag)
|
||||
Machine status bit flags.
|
||||
Possible bit flags:
|
||||
Machine status bit flags_1.
|
||||
Possible bit flags_1:
|
||||
BROKEN:1 -- Machine is broken
|
||||
NOPOWER:2 -- No power is being supplied to machine.
|
||||
POWEROFF:4 -- tbd
|
||||
@@ -119,16 +119,22 @@ Class Procs:
|
||||
var/critical_machine = FALSE //If this machine is critical to station operation and should have the area be excempted from power failures.
|
||||
var/list/occupant_typecache = list(/mob/living) // turned into typecache in Initialize
|
||||
var/atom/movable/occupant = null
|
||||
var/unsecuring_tool = /obj/item/weapon/wrench
|
||||
var/unsecuring_tool = /obj/item/wrench
|
||||
var/interact_open = FALSE // Can the machine be interacted with when in maint/when the panel is open.
|
||||
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
|
||||
var/speed_process = 0 // Process as fast as possible?
|
||||
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
|
||||
|
||||
/obj/machinery/Initialize()
|
||||
if(!armor)
|
||||
armor = list(melee = 25, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70)
|
||||
. = ..()
|
||||
GLOB.machines += src
|
||||
|
||||
if(ispath(circuit, /obj/item/circuitboard))
|
||||
circuit = new circuit
|
||||
circuit.apply_default_parts(src)
|
||||
|
||||
if(!speed_process)
|
||||
START_PROCESSING(SSmachines, src)
|
||||
else
|
||||
@@ -300,22 +306,22 @@ Class Procs:
|
||||
uid = gl_uid
|
||||
gl_uid++
|
||||
|
||||
/obj/machinery/proc/default_pry_open(obj/item/weapon/crowbar/C)
|
||||
. = !(state_open || panel_open || is_operational() || (flags & NODECONSTRUCT)) && istype(C)
|
||||
/obj/machinery/proc/default_pry_open(obj/item/crowbar/C)
|
||||
. = !(state_open || panel_open || is_operational() || (flags_1 & NODECONSTRUCT_1)) && istype(C)
|
||||
if(.)
|
||||
playsound(loc, C.usesound, 50, 1)
|
||||
visible_message("<span class='notice'>[usr] pries open \the [src].</span>", "<span class='notice'>You pry open \the [src].</span>")
|
||||
open_machine()
|
||||
return 1
|
||||
|
||||
/obj/machinery/proc/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 0)
|
||||
. = istype(C) && (panel_open || ignore_panel) && !(flags & NODECONSTRUCT)
|
||||
/obj/machinery/proc/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 0)
|
||||
. = istype(C) && (panel_open || ignore_panel) && !(flags_1 & NODECONSTRUCT_1)
|
||||
if(.)
|
||||
playsound(loc, C.usesound, 50, 1)
|
||||
deconstruct(TRUE)
|
||||
|
||||
/obj/machinery/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
on_deconstruction()
|
||||
if(component_parts && component_parts.len)
|
||||
spawn_frame(disassembled)
|
||||
@@ -334,7 +340,7 @@ Class Procs:
|
||||
M.icon_state = "box_1"
|
||||
|
||||
/obj/machinery/obj_break(damage_flag)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
stat |= BROKEN
|
||||
|
||||
/obj/machinery/contents_explosion(severity, target)
|
||||
@@ -347,8 +353,8 @@ Class Procs:
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/weapon/screwdriver/S)
|
||||
if(istype(S) && !(flags & NODECONSTRUCT))
|
||||
/obj/machinery/proc/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver/S)
|
||||
if(istype(S) && !(flags_1 & NODECONSTRUCT_1))
|
||||
playsound(loc, S.usesound, 50, 1)
|
||||
if(!panel_open)
|
||||
panel_open = TRUE
|
||||
@@ -361,7 +367,7 @@ Class Procs:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/weapon/wrench/W)
|
||||
/obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/wrench/W)
|
||||
if(panel_open && istype(W))
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
setDir(turn(dir,-90))
|
||||
@@ -375,8 +381,8 @@ Class Procs:
|
||||
return FAILED_UNFASTEN
|
||||
return SUCCESSFUL_UNFASTEN
|
||||
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY
|
||||
if(istype(W) && !(flags & NODECONSTRUCT))
|
||||
/obj/proc/default_unfasten_wrench(mob/user, obj/item/wrench/W, time = 20) //try to unwrench an object in a WONDERFUL DYNAMIC WAY
|
||||
if(istype(W) && !(flags_1 & NODECONSTRUCT_1))
|
||||
var/can_be_unfasten = can_be_unfasten_wrench(user)
|
||||
if(!can_be_unfasten || can_be_unfasten == FAILED_UNFASTEN)
|
||||
return can_be_unfasten
|
||||
@@ -400,24 +406,24 @@ Class Procs:
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W)
|
||||
/obj/machinery/proc/exchange_parts(mob/user, obj/item/storage/part_replacer/W)
|
||||
if(!istype(W))
|
||||
return
|
||||
if((flags & NODECONSTRUCT) && !W.works_from_distance)
|
||||
if((flags_1 & NODECONSTRUCT_1) && !W.works_from_distance)
|
||||
return
|
||||
var/shouldplaysound = 0
|
||||
if(component_parts)
|
||||
if(panel_open || W.works_from_distance)
|
||||
var/obj/item/weapon/circuitboard/machine/CB = locate(/obj/item/weapon/circuitboard/machine) in component_parts
|
||||
var/obj/item/circuitboard/machine/CB = locate(/obj/item/circuitboard/machine) in component_parts
|
||||
var/P
|
||||
if(W.works_from_distance)
|
||||
display_parts(user)
|
||||
for(var/obj/item/weapon/stock_parts/A in component_parts)
|
||||
for(var/obj/item/stock_parts/A in component_parts)
|
||||
for(var/D in CB.req_components)
|
||||
if(ispath(A.type, D))
|
||||
P = D
|
||||
break
|
||||
for(var/obj/item/weapon/stock_parts/B in W.contents)
|
||||
for(var/obj/item/stock_parts/B in W.contents)
|
||||
if(istype(B, P) && istype(A, P))
|
||||
if(B.rating > A.rating)
|
||||
W.remove_from_storage(B, src)
|
||||
@@ -467,9 +473,6 @@ Class Procs:
|
||||
/obj/machinery/proc/on_deconstruction()
|
||||
return
|
||||
|
||||
/obj/machinery/allow_drop()
|
||||
return 0
|
||||
|
||||
// Hook for html_interface module to prevent updates to clients who don't have this as their active machine.
|
||||
/obj/machinery/proc/hiIsValidClient(datum/html_interface_client/hclient, datum/html_interface/hi)
|
||||
if (hclient.client.mob && (hclient.client.mob.stat == 0 || IsAdminGhost(hclient.client.mob)))
|
||||
@@ -7,7 +7,6 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
desc = "An automated announcement system that handles minor announcements over the radio."
|
||||
icon = 'icons/obj/machines/telecomms.dmi'
|
||||
icon_state = "AAS_On"
|
||||
var/obj/item/device/radio/headset/radio
|
||||
|
||||
verb_say = "coldly states"
|
||||
verb_ask = "queries"
|
||||
@@ -16,6 +15,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
idle_power_usage = 20
|
||||
active_power_usage = 50
|
||||
|
||||
circuit = /obj/item/circuitboard/machine/announcement_system
|
||||
|
||||
var/obj/item/device/radio/headset/radio
|
||||
var/arrival = "%PERSON has signed up as %RANK"
|
||||
var/arrivalToggle = 1
|
||||
var/newhead = "%PERSON, %RANK, is the department head."
|
||||
@@ -25,24 +27,12 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
var/pinklight = "Light_Pink"
|
||||
var/errorlight = "Error_Red"
|
||||
|
||||
/obj/machinery/announcement_system/New()
|
||||
..()
|
||||
/obj/machinery/announcement_system/Initialize()
|
||||
. = ..()
|
||||
GLOB.announcement_systems += src
|
||||
radio = new /obj/item/device/radio/headset/ai(src)
|
||||
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/announcement_system(null)
|
||||
B.apply_default_parts(src)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/announcement_system
|
||||
name = "Announcement System (Machine Board)"
|
||||
build_path = /obj/machinery/announcement_system
|
||||
origin_tech = "programming=3;bluespace=3;magnets=2"
|
||||
req_components = list(
|
||||
/obj/item/stack/cable_coil = 2,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1)
|
||||
|
||||
/obj/machinery/announcement_system/update_icon()
|
||||
if(is_operational())
|
||||
icon_state = (panel_open ? "AAS_On_Open" : "AAS_On")
|
||||
@@ -70,7 +60,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params)
|
||||
if(istype(P, /obj/item/weapon/screwdriver))
|
||||
if(istype(P, /obj/item/screwdriver))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "<span class='notice'>You [panel_open ? "open" : "close"] the maintenance hatch of [src].</span>")
|
||||
|
||||
@@ -70,8 +70,8 @@
|
||||
O.add_fingerprint(user)
|
||||
update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/weapon/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weapon/weldingtool/WT = O
|
||||
else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weldingtool/WT = O
|
||||
if(obj_integrity < max_integrity)
|
||||
if(WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] begins repairing [src].", \
|
||||
@@ -92,7 +92,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/aug_manipulator/obj_break(damage_flag)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
@@ -7,9 +7,13 @@
|
||||
desc = "It produces items using metal and glass."
|
||||
icon_state = "autolathe"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
circuit = /obj/item/circuitboard/machine/autolathe
|
||||
|
||||
var/operating = FALSE
|
||||
anchored = TRUE
|
||||
var/list/L = list()
|
||||
var/list/LL = list()
|
||||
var/hacked = FALSE
|
||||
@@ -18,9 +22,7 @@
|
||||
var/hack_wire
|
||||
var/disable_wire
|
||||
var/shock_wire
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
var/busy = FALSE
|
||||
var/prod_coeff = 1
|
||||
|
||||
@@ -45,30 +47,16 @@
|
||||
"Imported"
|
||||
)
|
||||
|
||||
/obj/machinery/autolathe/New()
|
||||
..()
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
materials = new /datum/material_container(src, list(MAT_METAL, MAT_GLASS))
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/autolathe(null)
|
||||
B.apply_default_parts(src)
|
||||
|
||||
wires = new /datum/wires/autolathe(src)
|
||||
files = new /datum/research/autolathe(src)
|
||||
matching_designs = list()
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/autolathe
|
||||
name = "Autolathe (Machine Board)"
|
||||
build_path = /obj/machinery/autolathe
|
||||
origin_tech = "engineering=2;programming=2"
|
||||
req_components = list(
|
||||
/obj/item/weapon/stock_parts/matter_bin = 3,
|
||||
/obj/item/weapon/stock_parts/manipulator = 1,
|
||||
/obj/item/weapon/stock_parts/console_screen = 1)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autolathe/Destroy()
|
||||
qdel(wires)
|
||||
wires = null
|
||||
qdel(materials)
|
||||
materials = null
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(materials)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/autolathe/interact(mob/user)
|
||||
@@ -108,7 +96,7 @@
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
if(istype(O, /obj/item/weapon/crowbar))
|
||||
if(istype(O, /obj/item/crowbar))
|
||||
default_deconstruction_crowbar(O)
|
||||
return 1
|
||||
else if(is_wire_tool(O))
|
||||
@@ -121,12 +109,12 @@
|
||||
if(stat)
|
||||
return 1
|
||||
|
||||
if(istype(O, /obj/item/weapon/disk/design_disk))
|
||||
if(istype(O, /obj/item/disk/design_disk))
|
||||
user.visible_message("[user] begins to load \the [O] in \the [src]...",
|
||||
"You begin to load a design from \the [O]...",
|
||||
"You hear the chatter of a floppy drive.")
|
||||
busy = TRUE
|
||||
var/obj/item/weapon/disk/design_disk/D = O
|
||||
var/obj/item/disk/design_disk/D = O
|
||||
if(do_after(user, 14.4, target = src))
|
||||
for(var/B in D.blueprints)
|
||||
if(B)
|
||||
@@ -135,7 +123,7 @@
|
||||
busy = FALSE
|
||||
return 1
|
||||
|
||||
if(HAS_SECONDARY_FLAG(O, HOLOGRAM))
|
||||
if(O.flags_2 & HOLOGRAM_2)
|
||||
return 1
|
||||
|
||||
var/material_amount = materials.get_item_material_amount(O)
|
||||
@@ -256,11 +244,11 @@
|
||||
|
||||
/obj/machinery/autolathe/RefreshParts()
|
||||
var/T = 0
|
||||
for(var/obj/item/weapon/stock_parts/matter_bin/MB in component_parts)
|
||||
for(var/obj/item/stock_parts/matter_bin/MB in component_parts)
|
||||
T += MB.rating*75000
|
||||
materials.max_amount = T
|
||||
T=1.2
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
for(var/obj/item/stock_parts/manipulator/M in component_parts)
|
||||
T -= M.rating*0.2
|
||||
prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
var/radio_channel = "Common"
|
||||
var/minimum_time_between_warnings = 400
|
||||
|
||||
/obj/machinery/computer/bank_machine/Initialize(mapload)
|
||||
..()
|
||||
/obj/machinery/computer/bank_machine/Initialize()
|
||||
. = ..()
|
||||
radio = new(src)
|
||||
radio.subspace_transmission = TRUE
|
||||
radio.canhear_range = 0
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
var/skin = "doorctrl"
|
||||
power_channel = ENVIRON
|
||||
var/obj/item/device/assembly/device
|
||||
var/obj/item/weapon/electronics/airlock/board
|
||||
var/obj/item/electronics/airlock/board
|
||||
var/device_type = null
|
||||
var/id = null
|
||||
var/initialized_button = 0
|
||||
@@ -57,7 +57,7 @@
|
||||
icon_state = skin
|
||||
|
||||
/obj/machinery/button/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(panel_open || allowed(user))
|
||||
default_deconstruction_screwdriver(user, "button-open", "[skin]",W)
|
||||
update_icon()
|
||||
@@ -74,7 +74,7 @@
|
||||
device = W
|
||||
to_chat(user, "<span class='notice'>You add [W] to the button.</span>")
|
||||
|
||||
if(!board && istype(W, /obj/item/weapon/electronics/airlock))
|
||||
if(!board && istype(W, /obj/item/electronics/airlock))
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
to_chat(user, "<span class='warning'>\The [W] is stuck to you!</span>")
|
||||
return
|
||||
@@ -85,7 +85,7 @@
|
||||
req_access = board.accesses
|
||||
to_chat(user, "<span class='notice'>You add [W] to the button.</span>")
|
||||
|
||||
if(!device && !board && istype(W, /obj/item/weapon/wrench))
|
||||
if(!device && !board && istype(W, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start unsecuring the button frame...</span>")
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
if(do_after(user, 40*W.toolspeed, target = src))
|
||||
@@ -97,7 +97,7 @@
|
||||
update_icon()
|
||||
return
|
||||
|
||||
if(user.a_intent != INTENT_HARM && !(W.flags & NOBLUDGEON))
|
||||
if(user.a_intent != INTENT_HARM && !(W.flags_1 & NOBLUDGEON_1))
|
||||
return src.attack_hand(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -122,14 +122,14 @@
|
||||
var/msg2 = "<span class='notice'>[src] already has that upgrade!</span>"
|
||||
|
||||
// DECONSTRUCTION
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
panel_open = !panel_open
|
||||
to_chat(user, "<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
return
|
||||
|
||||
if(panel_open)
|
||||
if(istype(W, /obj/item/weapon/wirecutters)) //enable/disable the camera
|
||||
if(istype(W, /obj/item/wirecutters)) //enable/disable the camera
|
||||
toggle_cam(user, 1)
|
||||
obj_integrity = max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
|
||||
return
|
||||
@@ -139,7 +139,7 @@
|
||||
to_chat(user, "<span class='notice'>You [(view_range == initial(view_range)) ? "restore" : "mess up"] the camera's focus.</span>")
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
||||
else if(istype(W, /obj/item/weldingtool))
|
||||
if(weld(W, user))
|
||||
visible_message("<span class='warning'>[user] unwelds [src], leaving it as just a frame bolted to the wall.</span>", "<span class='warning'>You unweld [src], leaving it as just a frame bolted to the wall</span>")
|
||||
deconstruct(TRUE)
|
||||
@@ -176,14 +176,14 @@
|
||||
return
|
||||
|
||||
// OTHER
|
||||
if((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
|
||||
if((istype(W, /obj/item/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
|
||||
var/mob/living/U = user
|
||||
var/obj/item/weapon/paper/X = null
|
||||
var/obj/item/paper/X = null
|
||||
var/obj/item/device/pda/P = null
|
||||
|
||||
var/itemname = ""
|
||||
var/info = ""
|
||||
if(istype(W, /obj/item/weapon/paper))
|
||||
if(istype(W, /obj/item/paper))
|
||||
X = W
|
||||
itemname = X.name
|
||||
info = X.info
|
||||
@@ -222,8 +222,8 @@
|
||||
bug.bugged_cameras[src.c_tag] = src
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/pai_cable))
|
||||
var/obj/item/weapon/pai_cable/cable = W
|
||||
else if(istype(W, /obj/item/pai_cable))
|
||||
var/obj/item/pai_cable/cable = W
|
||||
cable.plugin(src, user)
|
||||
return
|
||||
|
||||
@@ -235,12 +235,12 @@
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/camera/obj_break(damage_flag)
|
||||
if(status && !(flags & NODECONSTRUCT))
|
||||
if(status && !(flags_1 & NODECONSTRUCT_1))
|
||||
triggerCameraAlarm()
|
||||
toggle_cam(null, 0)
|
||||
|
||||
/obj/machinery/camera/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(disassembled)
|
||||
if(!assembly)
|
||||
assembly = new()
|
||||
@@ -346,7 +346,7 @@
|
||||
|
||||
return null
|
||||
|
||||
/obj/machinery/camera/proc/weld(obj/item/weapon/weldingtool/WT, mob/living/user)
|
||||
/obj/machinery/camera/proc/weld(obj/item/weldingtool/WT, mob/living/user)
|
||||
if(busy)
|
||||
return FALSE
|
||||
if(!WT.remove_fuel(0, user))
|
||||
|
||||
@@ -39,14 +39,14 @@
|
||||
switch(state)
|
||||
if(1)
|
||||
// State 1
|
||||
if(istype(W, /obj/item/weapon/weldingtool))
|
||||
if(istype(W, /obj/item/weldingtool))
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You weld the assembly securely into place.</span>")
|
||||
anchored = TRUE
|
||||
state = 2
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You unattach the assembly from its place.</span>")
|
||||
new /obj/item/wallframe/camera(get_turf(src))
|
||||
@@ -65,7 +65,7 @@
|
||||
return
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/weldingtool))
|
||||
else if(istype(W, /obj/item/weldingtool))
|
||||
|
||||
if(weld(W, user))
|
||||
to_chat(user, "<span class='notice'>You unweld the assembly from its place.</span>")
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
if(3)
|
||||
// State 3
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
|
||||
var/input = stripped_input(user, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")
|
||||
@@ -100,7 +100,7 @@
|
||||
C.c_tag = "[A.name] ([rand(1, 999)])"
|
||||
|
||||
|
||||
else if(istype(W, /obj/item/weapon/wirecutters))
|
||||
else if(istype(W, /obj/item/wirecutters))
|
||||
new/obj/item/stack/cable_coil(get_turf(src), 2)
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You cut the wires from the circuits.</span>")
|
||||
@@ -117,7 +117,7 @@
|
||||
return
|
||||
|
||||
// Taking out upgrades
|
||||
else if(istype(W, /obj/item/weapon/crowbar) && upgrades.len)
|
||||
else if(istype(W, /obj/item/crowbar) && upgrades.len)
|
||||
var/obj/U = locate(/obj) in upgrades
|
||||
if(U)
|
||||
to_chat(user, "<span class='notice'>You unattach an upgrade from the assembly.</span>")
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/structure/camera_assembly/proc/weld(obj/item/weapon/weldingtool/WT, mob/living/user)
|
||||
/obj/structure/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user)
|
||||
if(!WT.remove_fuel(0, user))
|
||||
return 0
|
||||
to_chat(user, "<span class='notice'>You start to weld \the [src]...</span>")
|
||||
@@ -140,6 +140,6 @@
|
||||
return 0
|
||||
|
||||
/obj/structure/camera_assembly/deconstruct(disassembled = TRUE)
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal(loc)
|
||||
qdel(src)
|
||||
|
||||
@@ -58,12 +58,12 @@
|
||||
human = 1
|
||||
|
||||
var/name = M.name
|
||||
if (name in track.names)
|
||||
while(name in track.names)
|
||||
track.namecounts[name]++
|
||||
name = text("[] ([])", name, track.namecounts[name])
|
||||
else
|
||||
track.names.Add(name)
|
||||
track.namecounts[name] = 1
|
||||
track.names.Add(name)
|
||||
track.namecounts[name] = 1
|
||||
|
||||
if(human)
|
||||
track.humans[name] = M
|
||||
else
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 60
|
||||
power_channel = EQUIP
|
||||
var/obj/item/weapon/stock_parts/cell/charging = null
|
||||
var/obj/item/stock_parts/cell/charging = null
|
||||
var/chargelevel = -1
|
||||
|
||||
/obj/machinery/cell_charger/proc/updateicon()
|
||||
@@ -29,8 +29,8 @@
|
||||
if(charging)
|
||||
to_chat(user, "Current charge: [round(charging.percent(), 1)]%")
|
||||
|
||||
/obj/machinery/cell_charger/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/weapon/stock_parts/cell))
|
||||
/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stock_parts/cell))
|
||||
if(stat & BROKEN)
|
||||
to_chat(user, "<span class='warning'>[src] is broken!</span>")
|
||||
return
|
||||
@@ -55,7 +55,7 @@
|
||||
user.visible_message("[user] inserts a cell into the charger.", "<span class='notice'>You insert a cell into the charger.</span>")
|
||||
chargelevel = -1
|
||||
updateicon()
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
else if(istype(W, /obj/item/wrench))
|
||||
if(charging)
|
||||
to_chat(user, "<span class='warning'>Remove the cell first!</span>")
|
||||
return
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
icon_state = "pod_0"
|
||||
req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING.
|
||||
verb_say = "states"
|
||||
circuit = /obj/item/circuitboard/machine/clonepod
|
||||
|
||||
var/heal_level //The clone is released once its health reaches this level.
|
||||
var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine.
|
||||
var/mess = FALSE //Need to clean out it if it's full of exploded clone.
|
||||
@@ -46,8 +48,6 @@
|
||||
|
||||
/obj/machinery/clonepod/Initialize()
|
||||
. = ..()
|
||||
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/clonepod(null)
|
||||
B.apply_default_parts(src)
|
||||
|
||||
countdown = new(src)
|
||||
|
||||
@@ -59,24 +59,19 @@
|
||||
|
||||
/obj/machinery/clonepod/Destroy()
|
||||
go_out()
|
||||
qdel(radio)
|
||||
radio = null
|
||||
qdel(countdown)
|
||||
countdown = null
|
||||
QDEL_NULL(radio)
|
||||
QDEL_NULL(countdown)
|
||||
if(connected)
|
||||
connected.DetachCloner(src)
|
||||
for(var/i in unattached_flesh)
|
||||
qdel(i)
|
||||
LAZYCLEARLIST(unattached_flesh)
|
||||
unattached_flesh = null
|
||||
QDEL_LIST(unattached_flesh)
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/clonepod/RefreshParts()
|
||||
speed_coeff = 0
|
||||
efficiency = 0
|
||||
for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
|
||||
for(var/obj/item/stock_parts/scanning_module/S in component_parts)
|
||||
efficiency += S.rating
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts)
|
||||
for(var/obj/item/stock_parts/manipulator/P in component_parts)
|
||||
speed_coeff += P.rating
|
||||
heal_level = (efficiency * 15) + 10
|
||||
if(heal_level < MINIMUM_HEAL_LEVEL)
|
||||
@@ -84,35 +79,25 @@
|
||||
if(heal_level > 100)
|
||||
heal_level = 100
|
||||
|
||||
/obj/item/weapon/circuitboard/machine/clonepod
|
||||
name = "Clone Pod (Machine Board)"
|
||||
build_path = /obj/machinery/clonepod
|
||||
origin_tech = "programming=2;biotech=2"
|
||||
req_components = list(
|
||||
/obj/item/stack/cable_coil = 2,
|
||||
/obj/item/weapon/stock_parts/scanning_module = 2,
|
||||
/obj/item/weapon/stock_parts/manipulator = 2,
|
||||
/obj/item/stack/sheet/glass = 1)
|
||||
|
||||
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
|
||||
//TO-DO: Make the genetics machine accept them.
|
||||
/obj/item/weapon/disk/data
|
||||
/obj/item/disk/data
|
||||
name = "cloning data disk"
|
||||
icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk.
|
||||
var/list/fields = list()
|
||||
var/read_only = 0 //Well,it's still a floppy disk
|
||||
|
||||
//Disk stuff.
|
||||
/obj/item/weapon/disk/data/New()
|
||||
/obj/item/disk/data/New()
|
||||
..()
|
||||
icon_state = "datadisk[rand(0,6)]"
|
||||
add_overlay("datadisk_gene")
|
||||
|
||||
/obj/item/weapon/disk/data/attack_self(mob/user)
|
||||
/obj/item/disk/data/attack_self(mob/user)
|
||||
read_only = !read_only
|
||||
to_chat(user, "<span class='notice'>You flip the write-protect tab to [read_only ? "protected" : "unprotected"].</span>")
|
||||
|
||||
/obj/item/weapon/disk/data/examine(mob/user)
|
||||
/obj/item/disk/data/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].")
|
||||
|
||||
@@ -293,7 +278,7 @@
|
||||
use_power(200)
|
||||
|
||||
//Let's unlock this early I guess. Might be too early, needs tweaking.
|
||||
/obj/machinery/clonepod/attackby(obj/item/weapon/W, mob/user, params)
|
||||
/obj/machinery/clonepod/attackby(obj/item/W, mob/user, params)
|
||||
if(!(occupant || mess))
|
||||
if(default_deconstruction_screwdriver(user, "[icon_state]_maintenance", "[initial(icon_state)]",W))
|
||||
return
|
||||
@@ -483,7 +468,7 @@
|
||||
* Manual -- A big ol' manual.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/paper/guides/jobs/medical/cloning
|
||||
/obj/item/paper/guides/jobs/medical/cloning
|
||||
name = "paper - 'H-87 Cloning Apparatus Manual"
|
||||
info = {"<h4>Getting Started</h4>
|
||||
Congratulations, your station has purchased the H-87 industrial cloning device!<br>
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
desc = "Used to monitor the vitals of a patient during surgery."
|
||||
icon_screen = "crew"
|
||||
icon_keyboard = "med_key"
|
||||
circuit = /obj/item/weapon/circuitboard/computer/operating
|
||||
var/mob/living/carbon/human/patient = null
|
||||
var/obj/structure/table/optable/table = null
|
||||
circuit = /obj/item/circuitboard/computer/operating
|
||||
var/mob/living/carbon/human/patient
|
||||
var/obj/structure/table/optable/table
|
||||
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
|
||||
|
||||
+129
-142
@@ -1,142 +1,129 @@
|
||||
/obj/machinery/computer
|
||||
name = "computer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "computer"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 300
|
||||
active_power_usage = 300
|
||||
max_integrity = 200
|
||||
integrity_failure = 100
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
|
||||
var/obj/item/weapon/circuitboard/computer/circuit = null // if circuit==null, computer can't disassembly
|
||||
var/processing = FALSE
|
||||
var/brightness_on = 2
|
||||
var/icon_keyboard = "generic_key"
|
||||
var/icon_screen = "generic"
|
||||
var/clockwork = FALSE
|
||||
|
||||
/obj/machinery/computer/New(location, obj/item/weapon/circuitboard/C)
|
||||
..(location)
|
||||
if(C && istype(C))
|
||||
circuit = C
|
||||
//Some machines, oldcode arcades mostly, new themselves, so circuit
|
||||
//can already be an instance of a type and trying to new that will
|
||||
//cause a runtime
|
||||
else if(ispath(circuit))
|
||||
circuit = new circuit(null)
|
||||
|
||||
/obj/machinery/computer/Destroy()
|
||||
if(circuit)
|
||||
qdel(circuit)
|
||||
circuit = null
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/Initialize()
|
||||
. = ..()
|
||||
power_change()
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/ratvar_act()
|
||||
if(!clockwork)
|
||||
clockwork = TRUE
|
||||
icon_screen = "ratvar[rand(1, 4)]"
|
||||
icon_keyboard = "ratvar_key[rand(1, 6)]"
|
||||
icon_state = "ratvarcomputer[rand(1, 4)]"
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/narsie_act()
|
||||
if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork
|
||||
clockwork = FALSE
|
||||
icon_screen = initial(icon_screen)
|
||||
icon_keyboard = initial(icon_keyboard)
|
||||
icon_state = initial(icon_state)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/update_icon()
|
||||
cut_overlays()
|
||||
if(stat & NOPOWER)
|
||||
add_overlay("[icon_keyboard]_off")
|
||||
return
|
||||
add_overlay(icon_keyboard)
|
||||
if(stat & BROKEN)
|
||||
add_overlay("[icon_state]_broken")
|
||||
else
|
||||
add_overlay(icon_screen)
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
..()
|
||||
if(stat & NOPOWER)
|
||||
set_light(0)
|
||||
else
|
||||
set_light(brightness_on)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/screwdriver) && circuit && !(flags&NODECONSTRUCT))
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'> You start to disconnect the monitor...</span>")
|
||||
if(do_after(user, 20*I.toolspeed, target = src))
|
||||
deconstruct(TRUE, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(stat & BROKEN)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
|
||||
if(BURN)
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
/obj/machinery/computer/obj_break(damage_flag)
|
||||
if(circuit && !(flags & NODECONSTRUCT)) //no circuit, no breaking
|
||||
if(!(stat & BROKEN))
|
||||
playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(50))
|
||||
obj_break("energy")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
obj_break("energy")
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
|
||||
on_deconstruction()
|
||||
if(!(flags & NODECONSTRUCT))
|
||||
if(circuit) //no circuit, no computer frame
|
||||
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
|
||||
A.circuit = circuit
|
||||
A.anchored = TRUE
|
||||
if(stat & BROKEN)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
new /obj/item/weapon/shard(src.loc)
|
||||
A.state = 3
|
||||
A.icon_state = "3"
|
||||
else
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You disconnect the monitor.</span>")
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
circuit = null
|
||||
for(var/obj/C in src)
|
||||
C.forceMove(loc)
|
||||
|
||||
qdel(src)
|
||||
/obj/machinery/computer
|
||||
name = "computer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "computer"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 300
|
||||
active_power_usage = 300
|
||||
max_integrity = 200
|
||||
integrity_failure = 100
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 40, acid = 20)
|
||||
var/processing = FALSE
|
||||
var/brightness_on = 2
|
||||
var/icon_keyboard = "generic_key"
|
||||
var/icon_screen = "generic"
|
||||
var/clockwork = FALSE
|
||||
|
||||
/obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C)
|
||||
. = ..()
|
||||
power_change()
|
||||
|
||||
/obj/machinery/computer/Destroy()
|
||||
QDEL_NULL(circuit)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/machinery/computer/ratvar_act()
|
||||
if(!clockwork)
|
||||
clockwork = TRUE
|
||||
icon_screen = "ratvar[rand(1, 4)]"
|
||||
icon_keyboard = "ratvar_key[rand(1, 6)]"
|
||||
icon_state = "ratvarcomputer[rand(1, 4)]"
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/narsie_act()
|
||||
if(clockwork && clockwork != initial(clockwork)) //if it's clockwork but isn't normally clockwork
|
||||
clockwork = FALSE
|
||||
icon_screen = initial(icon_screen)
|
||||
icon_keyboard = initial(icon_keyboard)
|
||||
icon_state = initial(icon_state)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/update_icon()
|
||||
cut_overlays()
|
||||
if(stat & NOPOWER)
|
||||
add_overlay("[icon_keyboard]_off")
|
||||
return
|
||||
add_overlay(icon_keyboard)
|
||||
if(stat & BROKEN)
|
||||
add_overlay("[icon_state]_broken")
|
||||
else
|
||||
add_overlay(icon_screen)
|
||||
|
||||
/obj/machinery/computer/power_change()
|
||||
..()
|
||||
if(stat & NOPOWER)
|
||||
set_light(0)
|
||||
else
|
||||
set_light(brightness_on)
|
||||
update_icon()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver) && circuit && !(flags_1&NODECONSTRUCT_1))
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'> You start to disconnect the monitor...</span>")
|
||||
if(do_after(user, 20*I.toolspeed, target = src))
|
||||
deconstruct(TRUE, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(stat & BROKEN)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
|
||||
if(BURN)
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
/obj/machinery/computer/obj_break(damage_flag)
|
||||
if(circuit && !(flags_1 & NODECONSTRUCT_1)) //no circuit, no breaking
|
||||
if(!(stat & BROKEN))
|
||||
playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(50))
|
||||
obj_break("energy")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
obj_break("energy")
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
|
||||
on_deconstruction()
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(circuit) //no circuit, no computer frame
|
||||
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
|
||||
A.circuit = circuit
|
||||
A.anchored = TRUE
|
||||
if(stat & BROKEN)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
new /obj/item/shard(src.loc)
|
||||
new /obj/item/shard(src.loc)
|
||||
A.state = 3
|
||||
A.icon_state = "3"
|
||||
else
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You disconnect the monitor.</span>")
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
circuit = null
|
||||
for(var/obj/C in src)
|
||||
C.forceMove(loc)
|
||||
|
||||
qdel(src)
|
||||
@@ -4,13 +4,13 @@
|
||||
req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS)
|
||||
var/mob/living/silicon/ai/occupier = null
|
||||
var/active = 0
|
||||
circuit = /obj/item/weapon/circuitboard/computer/aifixer
|
||||
circuit = /obj/item/circuitboard/computer/aifixer
|
||||
icon_keyboard = "tech_key"
|
||||
icon_screen = "ai-fixer"
|
||||
light_color = LIGHT_COLOR_PINK
|
||||
|
||||
/obj/machinery/computer/aifixer/attackby(obj/I, mob/user, params)
|
||||
if(occupier && istype(I, /obj/item/weapon/screwdriver))
|
||||
if(occupier && istype(I, /obj/item/screwdriver))
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
to_chat(user, "<span class='warning'>The screws on [name]'s screen won't budge.</span>")
|
||||
else
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user