Merge branch 'master' into upstream-merge-29105

This commit is contained in:
LetterJay
2017-09-02 07:11:32 -05:00
committed by GitHub
1577 changed files with 55829 additions and 215217 deletions
File diff suppressed because it is too large Load Diff
+12 -6
View File
@@ -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")
-10
View File
@@ -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
+6 -6
View File
@@ -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"
+1 -1
View File
@@ -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
+3 -3
View File
@@ -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"
-16
View File
@@ -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"
+19
View File
@@ -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
+51
View File
@@ -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"
+429
View File
@@ -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
View File
@@ -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
View File
@@ -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()
+4 -4
View File
@@ -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
+24 -24
View File
@@ -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'
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
-10
View File
@@ -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 ..()
+3 -3
View File
@@ -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
+28 -21
View File
@@ -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"
+4 -4
View File
@@ -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")
+9 -9
View File
@@ -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
+28 -19
View File
@@ -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
+10 -10
View File
@@ -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"
+40 -40
View File
@@ -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>")
. = ..()
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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)
+20 -20
View File
@@ -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
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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)
+11 -11
View File
@@ -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
+17 -17
View File
@@ -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
+23 -24
View File
@@ -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"
+17 -17
View File
@@ -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
+11 -10
View File
@@ -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))
+59 -20
View File
@@ -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."
+13 -13
View File
@@ -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)
+26 -26
View File
@@ -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)
+76 -76
View File
@@ -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"
+4 -4
View File
@@ -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)
+3 -5
View File
@@ -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
+14 -12
View File
@@ -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()
+5 -17
View File
@@ -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)))
+6 -16
View File
@@ -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>")
+3 -3
View File
@@ -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()
+16 -28
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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 ..()
+11 -11
View File
@@ -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)
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+13 -28
View File
@@ -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 -3
View File
@@ -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
@@ -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)
+2 -2
View File
@@ -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