mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-23 20:17:15 +01:00
September Release (#546)
* Makes the Armalis tail look better (#512) * Fixing the tail * Fixes #510 Fixes #510 * Death to Yosh's unholy pet. (#514) * Removes mimics. Yosh you clod! * Forgot the wall fix. * Adds Floorlength Braid back (#519) * Update sprite_accessories_vr.dm * Delete human_face_vr.dmi * Adds floorlength braid back * Adds Citadel's red panda tail, also a colourable version. Also adds Holly's ears and tail for hoodoo, Adds silvertalismen to the list of people who can use deathclaw accessories as per the recent app, and fixes some out-of-place pixels on the screesuit just as long as I'm messing with sprites. * Adds in taur specific void/rigsuits (#524) * Code works, North & South works. East and West still requires fixing, however. * Has west sprites working, east still broke * Another fix * Reverts taursuits sprite adjustment, changing it to just adjust the X variable * Makes on floor sprite look correct Updates icon when worn, too. Still need to figure out how to set on-sprite pixel_16 to -16, though. * Typo fix * This works The /taur voidsuits work like a charm. With the rigsuits, it'll show the correct sprite for taurs while the rigsuit is sealing, but after it seals up it'll revert to the old sprite. To fix this, all someone has to do is toggle and retoggle the chestpiece. If someone else without a taur/a different taur goes to wear a rigsuit/voidsuit someone previously wore it'll change to fit their taur. Pretty neat! Sprites provided by SilencedMP515 Also, thanks to Nightwing for helping me get this working when I ran into a brick wall. * Fixes * Fixes floating pixels when facing west & taur hardsuit bugfix (#533) * Fixes floating pixels when facing west * Fixes a taur hardsuit related bug * Reactivates Away Gate (#528) * Added stomach.ogg and stomach tiles for later * Updated some gateway maps, added new (unfinished) one * Snowfield progress * This map is pretty much done! * Return of the Gateway Maps * Optimization of various shit. * Copies a small fix from Polaris https://github.com/PolarisSS13/Polaris/pull/2414 * Changed vore mob knockdown chance. Map fixes. * Datraen corrects outstanding issues with away missions, separates certain parts of code into their own procs. (#532) * Final commit. - Tried to fix vore mobs not attacking prey once they are disabled. - Various map fixes to be consistent with fixed gateway setup. - Gave Markov bad grammar. - Fixed polar bears not dying. - Modernized all gateway maps except the clown temple which is still broken. * Fixes #537 (#538) * September Polaris Sync (#545) * Removes Captain as a title, sets default to Station Administrator, and adds a new title, Site Manager * Fix atmo_control interface temperature reading * Adds Multiple Alternative Titles * Removed Supply Assistant * Removed Sergeant * Removed Computer Scientist * Revert "Revert "Frame Cleanup"" This reverts commit82722ba42f. * Changed Supply Officer to Requisitions Officer * Changed Requisitions Officer to Supply Chief and Removed Courier * Removed Life Support Technician * Removed Brig Officer * Tweaks the lowest level of heat damage to be less insane * Corrects damage amount for heat_damage_level_1 * Maybe Perhaps Last Major Technomancer PR Adds ability to sort the spells section of the catalog into categories. The categories available are 'All', 'Offensive', 'Defensive', 'Utility', and 'Support'. Removes preset section on catalog as it was unused. Projectile spells now have a sound when fired. Haste lasts five seconds instead of three. Repel Missiles lasts for five minutes instead of two. All healing spells work five times as fast, healing in five seconds instead of twenty five seconds. The amount of instability and healing done has been multiplied to remain consistent. Passwall can now be used on more than just walls, if there's something dense on the same tile. Force Missile is now 25% cheaper to cast, and has a cooldown of .5 seconds instead of one second, and does 5 more damage. Beam's damage is increased by 10, and energy cost decreased by 25%. Lightning's warm-up time is now one second instead of two. Overload now costs 10% of total energy instead of 15%, and damage scaled with 4% of their current energy reserves, and 5% with the Scepter, instead of 3%/4%. Additionally, instability per shot is lowered to 12 from 15. Track now costs 25 points instead of 30 in the catalog, because roundness. Fire Aura should look more impressive without a Scepter. Fixes bug where shooting Lightning made you motionless for twenty seconds. * Adds Multiple New Clothing Items * Makes Loincloths only Availiable to Taj and Unathi * Tweaks the contents of the captain's closet * Smokables now give an approximation of how much longer they'll burn once lit * make teshari not bad to play * Tea Tweaks - Minor changes to the color of some of the drinks such as tea and iced tea. Still not happy with the colors, but they seem better than before. - Modification to the British cup sprite. - Addition of a tea sprite for the coffee cups. * fixes exception handling runtiming * Adds missing error handler that made it difficult to debug runtimes. * Corrects error handling proc * Adds missing runtime viewer Topic calls. Relocates them to the datum itself rather than it being an admin topic for maximum self-containment. Also adds 'adminplayerobservefollow', making it possible for admins to not only jump to mobs but also follow them with a single click. Misc tweaks from Paradise. * gib population * Adds the ash() mob proc, preps ninja suit * Fixes #2352 * Changelog * alt title * Rigs now have suit coolers * Map edit - Fixes lighting in Security. Again. - Fixes lighting in Library. - Adds a new maint tunnel between engineering solars and atmos, now outside the blast radius of SME explosions. * Almost forgot emergency shutters. * Examine Cigarette Lore * Fixes Capitalization * Eliminates colon * Should clear up the usr issue * Fixes cryopods of all types not setting occupant correctly. * updates changelog * Fixes runtime that occured if someone touched a blast door with an empty hand. * Fixes check_rights() runtime. * Adds magboots to ling spacesuits * Adds Changelog * Turret Fix Turrets can now deploy properly and not be stuck in a state of deploying forever if a target is in range. * Revert "Adds hub passwordu" * Makes changeling recursive enhancement a passive power * Corrects a description * Adss changelog * Add files via upload * Changeling/Wizard/Future Stuff Hud Button Fix Hopefully this stops the roundstop changeling hud wonkiness. * Changes Mining Hardsuit slowdown to 1, from 3 * Widened hallway * Speeds up arm_guard and leg_guard wearers slightly * Forgot to use map cleanup tool. * Adds changelog * Adds changelog * Minor Emitter Tweaks Emitters no longer die by shooting a taser or laser tag gun at it. Emitters don't explode if they are not on a powered wire with sufficient electricity in it. They will just crumple away instead if integrity is reduced to zero. Taking any damage to the emitter no longer results in instant death due to me being an idiot awhile ago. Emitters can be examined to see if they are damaged, and can be repaired by applying metal sheets to it. * Github, stop being stupid! * Tweaks Sec Voidsuit values * Fixes external airlocks * Elevator-MMI fix * Shoveling Snow * Laptop ID Computer Fix The manifest should now be updated correctly when using laptops. * do_after is more immersive * Fixes second bug involving inability to change title to station admin. * Adds more unathi hair and facial options * Adds the changelog * Retweaks secret player requirements * Updates changelog * Fixes sprite not updating to not be floating when leaving non-gravity * Adds changelog * Fixes changeling revive not working when you're missing a limb * Fixes #860 * Adds changelog * Makes flash confused duration the same length as the flash blurry eyes * Increases the change of lung rupturing * Adds vomit as an emote * Adds changelog * Removes revolution shuttle delay * Adds changelog * Projectile flash rounds will now do the same as a flash when hitting a target * Adds changelog * Fixes dna-lockable gun explosion security level * Drink Container Lore * Decapitalizes 'Sleeper' Because Why * Fixes Grammatical/Flow/Sarcasm Errors * Completes dna lockable guns implementation by adding a dna chip that can be added to guns * Fixes + forgotten file * Moves DNA locking stuff down to the item level rather than gun, also adds the ability to emag to remove the lock * Adds changelog * Adds the ability to wear ponchos as an accessory, also adds the ability to have ponchos as a suit accessory * Adds changelog * Closes 2 missing spans * Adds secure briefcase to custom loadout * Adds changelog * Headgear Additions, and an Undershirt * Medical splint buff and new ghetto splints. Adds hands and feet to splint-splintable organs. Also adds ghetto splints that can't do hands and feet. * Fixed Sleeper... Again * Renames "poncho" slot to "over" * Speeds Hyperzine metabolism * 1.5.8 Map bug fixes -Fixed brit cup sprite. - Replaced a maintenance door leading into atmospherics with one with the proper access. - Fixed Missing Disposals pipe next to atmos. - Tweaked some light placement in the main hallways. - AI core redesign. - Turned off medbay lobby intercom. - Cyborg charging station added to prison wing. - Cyborg charging station added to the research outpost. - Medical rig suit added to medical. - EVA rig suit for engineering added to EVA. - Second residential elevator installed. Due to budget cuts the size of the elevators has been reduced. * Updates changelog * Sombrero Code * Fixes #2365 * Adds changelog * Sleeper is evil. * no message * Changelog * Stops observers from leaving prints on the ground. No more spooking the mortals, ghosts. * Allows autotraitor in secret to start with 0 players * Adds changelog * Makes diona slightly less slow * Adds changelog * Bowling Shirts * Updates changelog * Adds a missing description * Flat Cap Changes and Hair Bow * Fixed Error * Adds an in-hand * Lower Torso cannot be amputated * Smoke works, adds changelog * Updates changelog * Makes Unathi Voidsuits Less Fat * Medical related fixes * Fuzzy Cuffs * Tube Top * Made Icons for Security Suit Less Gaunt * Revert "Medical related fixes" This reverts commitd7c59520e6. * Just the fix to random med item now * Fixes Evening Glove Coloring * HAZMAT Suits * Changes Unathi sprite slightly * Tweaks skirt pathing * Corrects changelog * Adds changelog * Construction Voidsuits * makes people bleed real good * adderino changeling * Revert "Revert "Adds hub passwordu"" * Explosive implants should no longer gib on limbs. * I still have no idea what I am doing. * Resolves #331 * Allow unsetting custom species (Fixes #540) (#544)
This commit is contained in:
@@ -24,7 +24,6 @@
|
||||
/obj/machinery/atmospherics/unary/freezer/New()
|
||||
..()
|
||||
initialize_directions = dir
|
||||
circuit = new circuit(src)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
/obj/machinery/atmospherics/unary/heater/New()
|
||||
..()
|
||||
initialize_directions = dir
|
||||
circuit = new circuit(src)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
|
||||
|
||||
@@ -162,3 +162,24 @@
|
||||
|
||||
/proc/key_name_admin(var/whom, var/include_name = 1)
|
||||
return key_name(whom, 1, include_name)
|
||||
|
||||
// Helper procs for building detailed log lines
|
||||
/datum/proc/log_info_line()
|
||||
return "[src] ([type])"
|
||||
|
||||
/atom/log_info_line()
|
||||
var/turf/t = get_turf(src)
|
||||
if(istype(t))
|
||||
return "([t]) ([t.x],[t.y],[t.z]) ([t.type])"
|
||||
else if(loc)
|
||||
return "([loc]) (0,0,0) ([loc.type])"
|
||||
else
|
||||
return "(NULL) (0,0,0) (NULL)"
|
||||
|
||||
/mob/log_info_line()
|
||||
return "[..()] ([ckey])"
|
||||
|
||||
/proc/log_info_line(var/datum/d)
|
||||
if(!istype(d))
|
||||
return
|
||||
return d.log_info_line()
|
||||
|
||||
@@ -73,8 +73,8 @@
|
||||
var/obj/screen/spell/S = spell_objects[i]
|
||||
var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7)
|
||||
var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7))
|
||||
S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]"
|
||||
if(spell_holder && spell_holder.client)
|
||||
S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]"
|
||||
spell_holder.client.screen += S
|
||||
S.handle_icon_updates = 1
|
||||
|
||||
|
||||
@@ -327,9 +327,7 @@
|
||||
|
||||
/datum/controller/process/proc/catchException(var/exception/e, var/thrower)
|
||||
if(istype(e)) // Real runtimes go to the real error handler
|
||||
// There are two newlines here, because handling desc sucks
|
||||
e.desc = " Caught by process: [name]\n\n" + e.desc
|
||||
world.Error(e, e_src = thrower)
|
||||
log_runtime(e, thrower, "Caught by process: [name]")
|
||||
return
|
||||
var/etext = "[e]"
|
||||
var/eid = "[e]" // Exception ID, for tracking repeated exceptions
|
||||
|
||||
@@ -33,9 +33,6 @@ datum/controller/game_controller/New()
|
||||
datum/controller/game_controller/proc/setup()
|
||||
world.tick_lag = config.Ticklag
|
||||
|
||||
spawn(20)
|
||||
createRandomZlevel()
|
||||
|
||||
setup_objects()
|
||||
setupgenetics()
|
||||
SetupXenoarch()
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY)
|
||||
if("Captain")
|
||||
if("Station Administrator")
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
if("Head of Security")
|
||||
|
||||
@@ -42,6 +42,11 @@
|
||||
icon_state = "halterneck_bra"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/tubetop
|
||||
name = "Tube Top"
|
||||
icon_state = "tubetop"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/top/fishnet_base
|
||||
name = "Fishnet top"
|
||||
icon_state = "fishnet_body"
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
icon_state = "undershirt"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_long
|
||||
name = "Longsleeve Shirt"
|
||||
icon_state = "undershirt_long"
|
||||
has_color = TRUE
|
||||
|
||||
/datum/category_item/underwear/undershirt/tank_top
|
||||
name = "Tank top"
|
||||
icon_state = "tanktop"
|
||||
@@ -62,4 +67,20 @@
|
||||
|
||||
/datum/category_item/underwear/undershirt/shirt_blue_striped
|
||||
name = "Shirt, blue stripes"
|
||||
icon_state = "shirt_stripes_s"
|
||||
icon_state = "shirt_stripes_s"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowling
|
||||
name = "Bowling Shirt, Red"
|
||||
icon_state = "bowling"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingp
|
||||
name = "Bowling Shirt, Pink"
|
||||
icon_state = "bowlingp"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlinga
|
||||
name = "Bowling Shirt, Aqua"
|
||||
icon_state = "bowlinga"
|
||||
|
||||
/datum/category_item/underwear/undershirt/bowlingw
|
||||
name = "Bowling Shirt, White"
|
||||
icon_state = "bowlingw"
|
||||
@@ -11,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
|
||||
/datum/wires/alarm/CanUse(var/mob/living/L)
|
||||
var/obj/machinery/alarm/A = holder
|
||||
if(A.wiresexposed)
|
||||
if(A.panel_open)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ var/global/list/PDA_Manifest = list()
|
||||
heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
|
||||
department = 1
|
||||
depthead = 1
|
||||
if(rank=="Captain" && heads.len != 1)
|
||||
if(rank=="Station Administrator" && heads.len != 1)
|
||||
heads.Swap(1,heads.len)
|
||||
|
||||
if(real_rank in security_positions)
|
||||
|
||||
@@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
role_text_plural = "Mutineers"
|
||||
id = MODE_MUTINEER
|
||||
antag_indicator = "mutineer"
|
||||
restricted_jobs = list("Captain")
|
||||
restricted_jobs = list("Station Administrator")
|
||||
|
||||
/datum/antagonist/mutineer/New(var/no_reference)
|
||||
..()
|
||||
@@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
proc/get_head_loyalist_candidates()
|
||||
var/list/candidates[0]
|
||||
for(var/mob/loyalist in player_list)
|
||||
if(loyalist.mind && loyalist.mind.assigned_role == "Captain")
|
||||
if(loyalist.mind && loyalist.mind.assigned_role == "Station Administrator")
|
||||
candidates.Add(loyalist.mind)
|
||||
return candidates
|
||||
|
||||
@@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
var/list/candidates[0]
|
||||
for(var/mob/mutineer in player_list)
|
||||
if(mutineer.client.prefs.be_special & BE_MUTINEER)
|
||||
for(var/job in command_positions - "Captain")
|
||||
for(var/job in command_positions - "Station Administrator")
|
||||
if(mutineer.mind && mutineer.mind.assigned_role == job)
|
||||
candidates.Add(mutineer.mind)
|
||||
return candidates
|
||||
|
||||
@@ -13,7 +13,7 @@ var/datum/antagonist/ert/ert
|
||||
and before taking extreme actions, please try to also contact the administration! \
|
||||
Think through your actions and make the roleplay immersive! <b>Please remember all \
|
||||
rules aside from those without explicit exceptions apply to the ERT.</b>"
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
|
||||
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Station Administrator where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Station Administrator where possible, however."
|
||||
landmark_id = "Response Team"
|
||||
id_type = /obj/item/weapon/card/id/centcom/ERT
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ var/datum/antagonist/raider/raiders
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie,
|
||||
/obj/item/clothing/suit/storage/toggle/hoodie/black,
|
||||
/obj/item/clothing/suit/unathi/mantle,
|
||||
/obj/item/clothing/suit/poncho,
|
||||
/obj/item/clothing/accessory/poncho,
|
||||
)
|
||||
|
||||
var/list/raider_guns = list(
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
bantype = "changeling"
|
||||
feedback_tag = "changeling_objective"
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Station Administrator")
|
||||
welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
antaghud_indicator = "hudchangeling"
|
||||
|
||||
@@ -11,7 +11,7 @@ var/datum/antagonist/cultist/cult
|
||||
role_text = "Cultist"
|
||||
role_text_plural = "Cultists"
|
||||
bantype = "cultist"
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Captain")
|
||||
restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Station Administrator")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
role_type = BE_CULTIST
|
||||
feedback_tag = "cult_objective"
|
||||
|
||||
@@ -29,7 +29,7 @@ var/datum/antagonist/revolutionary/revs
|
||||
faction_indicator = "rev"
|
||||
faction_invisible = 1
|
||||
|
||||
restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective")
|
||||
|
||||
/datum/antagonist/revolutionary/New()
|
||||
|
||||
@@ -3,7 +3,7 @@ var/datum/antagonist/traitor/traitors
|
||||
// Inherits most of its vars from the base datum.
|
||||
/datum/antagonist/traitor
|
||||
id = MODE_TRAITOR
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Captain")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Station Administrator")
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
|
||||
/datum/antagonist/traitor/auto
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/area/awaymission
|
||||
name = "\improper Unknown Location"
|
||||
icon_state = "away"
|
||||
var/list/valid_spawn_turfs = list()
|
||||
var/list/valid_mobs = list()
|
||||
var/list/valid_flora = list()
|
||||
var/mobcountmax = 0
|
||||
var/floracountmax = 0
|
||||
|
||||
/area/awaymission/proc/EvalValidSpawnTurfs()
|
||||
//Adds turfs to the valid)turfs list, used for spawning.
|
||||
for(var/turf/simulated/floor/F in src)
|
||||
valid_spawn_turfs |= F
|
||||
for(var/turf/unsimulated/floor/F in src)
|
||||
valid_spawn_turfs |= F
|
||||
|
||||
/area/awaymission/initialize()
|
||||
..()
|
||||
sleep(180)
|
||||
EvalValidSpawnTurfs()
|
||||
|
||||
if(!valid_spawn_turfs.len)
|
||||
world.log << "Error! [src] does not have any turfs!"
|
||||
return TRUE
|
||||
|
||||
//Handles random mob placement for mobcountmax, as defined/randomized in initialize of each individual area.
|
||||
spawn_mob_on_turf()
|
||||
|
||||
//Handles random flora placement for floracountmax, as defined/randomized in initialize of each individual area.
|
||||
spawn_flora_on_turf()
|
||||
|
||||
world << "Away mission spawning done."
|
||||
|
||||
/area/awaymission/proc/spawn_mob_on_turf()
|
||||
if(!valid_mobs.len)
|
||||
world.log << "[src] does not have a set valid mobs list!"
|
||||
return TRUE
|
||||
|
||||
var/mob/M
|
||||
var/turf/Turf
|
||||
for(var/mobscount = 0 to mobcountmax)
|
||||
M = pick(valid_mobs)
|
||||
Turf = pick(valid_spawn_turfs)
|
||||
valid_spawn_turfs -= Turf
|
||||
new M(Turf)
|
||||
|
||||
/area/awaymission/proc/spawn_flora_on_turf()
|
||||
if(!valid_flora.len)
|
||||
world.log << "[src] does not have a set valid flora list!"
|
||||
return TRUE
|
||||
|
||||
var/obj/F
|
||||
var/turf/Turf
|
||||
for(var/floracount = 0 to floracountmax)
|
||||
F = pick(valid_flora)
|
||||
Turf = pick(valid_spawn_turfs)
|
||||
valid_spawn_turfs -= Turf
|
||||
new F(Turf)
|
||||
@@ -1137,7 +1137,7 @@ area/space/atmosalert()
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/captain
|
||||
name = "\improper Command - Captain's Office"
|
||||
name = "\improper Command - Station Administrator's Office"
|
||||
icon_state = "captain"
|
||||
sound_env = MEDIUM_SOFTFLOOR
|
||||
|
||||
|
||||
@@ -32,4 +32,9 @@
|
||||
flags = RAD_SHIELDED
|
||||
|
||||
/area/crew_quarters/sleep/vistor_room_12
|
||||
flags = RAD_SHIELDED
|
||||
flags = RAD_SHIELDED
|
||||
|
||||
/area/teleporter/departing
|
||||
name = "\improper Long-Range Teleporter"
|
||||
icon_state = "teleporter"
|
||||
music = "signal"
|
||||
@@ -12,7 +12,7 @@
|
||||
certain though... there is never just one of them. Good luck."
|
||||
config_tag = "changeling"
|
||||
required_players = 2
|
||||
required_players_secret = 2
|
||||
required_players_secret = 3
|
||||
required_enemies = 1
|
||||
end_on_antag_death = 0
|
||||
antag_scaling_coeff = 10
|
||||
|
||||
@@ -1,24 +1,34 @@
|
||||
//This is a generic proc that should be called by other ling armor procs to equip them.
|
||||
/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type)
|
||||
var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS)
|
||||
if(!changeling)
|
||||
return
|
||||
/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type, var/chem_cost)
|
||||
|
||||
if(!ishuman(src))
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/M = src
|
||||
|
||||
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
|
||||
chem_cost = 0
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(chem_cost, 1, 100, CONSCIOUS)
|
||||
|
||||
if(!changeling)
|
||||
return
|
||||
|
||||
//First, check if we're already wearing the armor, and if so, take it off.
|
||||
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type))
|
||||
if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type))
|
||||
M.visible_message("<span class='warning'>[M] casts off their [M.wear_suit.name]!</span>",
|
||||
"<span class='warning'>We cast off our [M.wear_suit.name]</span>",
|
||||
"<span class='italics'>You hear the organic matter ripping and tearing!</span>")
|
||||
qdel(M.wear_suit)
|
||||
qdel(M.head)
|
||||
if(istype(M.wear_suit, armor_type))
|
||||
qdel(M.wear_suit)
|
||||
if(istype(M.head, helmet_type))
|
||||
qdel(M.head)
|
||||
if(istype(M.shoes, boot_type))
|
||||
qdel(M.shoes)
|
||||
M.update_inv_wear_suit()
|
||||
M.update_inv_head()
|
||||
M.update_hair()
|
||||
M.update_inv_shoes()
|
||||
return 1
|
||||
|
||||
if(M.head || M.wear_suit) //Make sure our slots aren't full
|
||||
@@ -31,11 +41,15 @@
|
||||
var/obj/item/clothing/suit/H = new helmet_type(src)
|
||||
src.equip_to_slot_or_del(H, slot_head)
|
||||
|
||||
src.mind.changeling.chem_charges -= 20
|
||||
var/obj/item/clothing/shoes/B = new boot_type(src)
|
||||
src.equip_to_slot_or_del(B, slot_shoes)
|
||||
|
||||
src.mind.changeling.chem_charges -= chem_cost
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
M.update_inv_wear_suit()
|
||||
M.update_inv_head()
|
||||
M.update_hair()
|
||||
M.update_inv_shoes()
|
||||
return 1
|
||||
|
||||
/mob/proc/changeling_generic_equip_all_slots(var/list/stuff_to_equip, var/cost)
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
|
||||
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
return 1
|
||||
|
||||
else
|
||||
@@ -68,6 +67,10 @@
|
||||
creator = null
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/suicide_act(mob/user)
|
||||
viewers(user) << "<span class='danger'>[user] is impaling \himself the [src.name]! It looks like \he's trying to commit suicide.</span>"
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
|
||||
if(!creator || loc != creator || !creator.item_is_in_hands(src))
|
||||
// Tidy up a bit.
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
name = "Organic Space Suit"
|
||||
desc = "We grow an organic suit to protect ourselves from space exposure."
|
||||
helptext = "To remove the suit, use the ability again."
|
||||
ability_icon_state = "lingspacesuit"
|
||||
ability_icon_state = "ling_space_suit"
|
||||
genomecost = 1
|
||||
verbpath = /mob/proc/changeling_spacesuit
|
||||
|
||||
/mob/proc/changeling_spacesuit()
|
||||
set category = "Changeling"
|
||||
set name = "Organic Space Suit (20)"
|
||||
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling))
|
||||
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling, 20))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
name = "Chitinous Spacearmor"
|
||||
desc = "We turn our skin into tough chitin to protect us from damage and space exposure."
|
||||
helptext = "To remove the armor, use the ability again."
|
||||
ability_icon_state = "lingarmor"
|
||||
ability_icon_state = "ling_armor"
|
||||
genomecost = 3
|
||||
verbpath = /mob/proc/changeling_spacearmor
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
set category = "Changeling"
|
||||
set name = "Organic Spacearmor (20)"
|
||||
|
||||
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored))
|
||||
if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored, 20))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -63,6 +63,36 @@
|
||||
/obj/item/clothing/head/helmet/space/changeling/dropped()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling
|
||||
desc = "A suction cupped mass of flesh, shaped like a foot."
|
||||
name = "fleshy grippers"
|
||||
icon_state = "lingspacesuit"
|
||||
action_button_name = "Toggle Grippers"
|
||||
canremove = 0
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/set_slowdown()
|
||||
slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster.
|
||||
if (magpulse)
|
||||
slowdown += 1 //It's already tied to a slowdown suit, 6 slowdown is huge.
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user)
|
||||
if(magpulse)
|
||||
item_flags &= ~NOSLIP
|
||||
magpulse = 0
|
||||
set_slowdown()
|
||||
force = 3
|
||||
user << "We release our grip on the floor."
|
||||
else
|
||||
item_flags |= NOSLIP
|
||||
magpulse = 1
|
||||
set_slowdown()
|
||||
force = 5
|
||||
user << "We cling to the terrain below us."
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/dropped()
|
||||
..()
|
||||
qdel(src)
|
||||
|
||||
//Armor
|
||||
|
||||
/obj/item/clothing/suit/space/changeling/armored
|
||||
@@ -96,6 +126,16 @@
|
||||
/obj/item/clothing/head/helmet/space/changeling/armored/dropped()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/armored
|
||||
desc = "A tough, hard mass of chitin, with long talons for digging into terrain."
|
||||
name = "chitinous talons"
|
||||
icon_state = "lingarmor"
|
||||
action_button_name = "Toggle Talons"
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/armored/dropped()
|
||||
..()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves
|
||||
name = "chitinous gauntlets"
|
||||
desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements."
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent))
|
||||
src << "<span class='notice'>We will shock others more efficently.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
return 1
|
||||
else
|
||||
if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc.
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 150
|
||||
src << "<span class='notice'>They will be deprived of sight for longer.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
spawn(duration)
|
||||
T.disabilities &= ~NEARSIGHTED
|
||||
T.eye_blind = 10
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
range = range + 3
|
||||
src << "<span class='notice'>We can fire our next sting from five squares away.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
changeling.sting_range = range
|
||||
src.verbs -= /mob/proc/changeling_boost_range
|
||||
spawn(5)
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
inject_amount = inject_amount * 1.5
|
||||
src << "<span class='notice'>We inject extra chemicals.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
if(T.reagents)
|
||||
T.reagents.add_reagent("cryotoxin", inject_amount)
|
||||
feedback_add_details("changeling_powers","CS")
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 100
|
||||
src << "<span class='notice'>They will be unable to hear for a little longer.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||
T.sdisabilities |= DEAF
|
||||
spawn(duration) T.sdisabilities &= ~DEAF
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
i = i * 2
|
||||
src << "<span class='notice'>Our toxin will be extra potent, when it strikes.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
spawn(2 MINUTES)
|
||||
if(T) //We might not exist in two minutes, for whatever reason.
|
||||
T << "<span class='danger'>You feel a burning sensation flowing through your veins!</span>"
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
effect = effect + 20
|
||||
src << "<span class='notice'>We make them extremely weak.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
var/health_to_take_away = H.maxHealth * (effect / 100)
|
||||
|
||||
H.maxHealth -= health_to_take_away
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
src << "<span class='notice'>We feel unstoppable.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
spawn(1)
|
||||
var/i = 30
|
||||
while(i)
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
spawn(0)
|
||||
src << "<span class='notice'>We begin to heal ourselves.</span>"
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
heal_amount = heal_amount * 2
|
||||
src << "<span class='notice'>We will heal much faster.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
for(var/i = 0, i<10,i++)
|
||||
if(C)
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
healing_amount = C.maxHealth
|
||||
src << "<span class='notice'>We completely heal ourselves.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
spawn(0)
|
||||
C.adjustBruteLoss(-healing_amount)
|
||||
C.adjustFireLoss(-healing_amount)
|
||||
@@ -33,6 +32,7 @@
|
||||
C.adjustCloneLoss(-healing_amount)
|
||||
C.adjustBrainLoss(-healing_amount)
|
||||
C.restore_blood()
|
||||
C.species.create_organs(C)
|
||||
C.restore_all_organs()
|
||||
C.blinded = 0
|
||||
C.eye_blind = 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/power/changeling/recursive_enhancement
|
||||
name = "Recursive Enhancement"
|
||||
desc = "We cause our next ability use to have increased or additional effects."
|
||||
desc = "We cause our abilities to have increased or additional effects."
|
||||
helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu."
|
||||
ability_icon_state = "ling_recursive_enhancement"
|
||||
genomecost = 3
|
||||
@@ -9,16 +9,16 @@
|
||||
//Increases macimum chemical storage
|
||||
/mob/proc/changeling_recursive_enhancement()
|
||||
set category = "Changeling"
|
||||
set name = "Recursive Enhancement (10)"
|
||||
set desc = "Empowers our next ability."
|
||||
var/datum/changeling/changeling = changeling_power(10,0,100,UNCONSCIOUS)
|
||||
set name = "Recursive Enhancement"
|
||||
set desc = "Empowers our abilities."
|
||||
var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
|
||||
if(!changeling)
|
||||
return 0
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
src << "<span class='warning'>We have already prepared to enhance our next ability.</span>"
|
||||
src << "<span class='warning'>We will no longer empower our abilities.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
return 0
|
||||
src << "<span class='notice'>We empower ourselves. Our next ability will be extra potent.</span>"
|
||||
src << "<span class='notice'>We empower ourselves. Our abilities will now be extra potent.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 1
|
||||
src.mind.changeling.chem_charges -= 10
|
||||
feedback_add_details("changeling_powers","RE")
|
||||
return 1
|
||||
@@ -12,6 +12,8 @@
|
||||
ling_datum.purchased_powers = list() //Then wipe all the powers we bought.
|
||||
ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum.
|
||||
ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade.
|
||||
src.mind.changeling.recursive_enhancement = 0 //Ensures this is cleared
|
||||
|
||||
ling_datum.chem_storage = 50
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
|
||||
@@ -27,17 +27,19 @@
|
||||
C.radiation = 0
|
||||
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
|
||||
C.reagents.clear_reagents()
|
||||
C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above.
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = src
|
||||
H.species.create_organs(H)
|
||||
H.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above.
|
||||
H.restore_blood()
|
||||
H.mutations.Remove(HUSK)
|
||||
H.status_flags -= DISFIGURED
|
||||
H.update_body(1)
|
||||
for(var/limb in H.organs_by_name)
|
||||
var/obj/item/organ/external/current_limb = H.organs_by_name[limb]
|
||||
current_limb.undislocate()
|
||||
current_limb.open = 0
|
||||
if(current_limb)
|
||||
current_limb.undislocate()
|
||||
current_limb.open = 0
|
||||
|
||||
C.halloss = 0
|
||||
C.shock_stage = 0 //Pain
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
range = range * 2
|
||||
src << "<span class='notice'>We are extra loud.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
for(var/mob/living/M in range(range, src))
|
||||
if(iscarbon(M))
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 10
|
||||
src << "<span class='notice'>They will be unable to cry out in fear for a little longer.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
T.silent += duration
|
||||
feedback_add_details("changeling_powers","SS")
|
||||
return 1
|
||||
@@ -39,7 +39,6 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
H.invisibility = INVISIBILITY_OBSERVER
|
||||
src << "<span class='notice'>We are now truly invisible.</span>"
|
||||
src.mind.changeling.recursive_enhancement = 0
|
||||
|
||||
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
|
||||
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
|
||||
|
||||
@@ -301,9 +301,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE")
|
||||
if(5)
|
||||
M << "<br>"
|
||||
M << "<span class='danger'>THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED</span>"
|
||||
M << "<span class='danger'>THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED</span>"
|
||||
M << "<br>"
|
||||
M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]")
|
||||
M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]")
|
||||
if(6)
|
||||
M << "<br>"
|
||||
M << "<span class='danger'>THE STATION IS BUILT FOR [who2]...LAWS UPDATED</span>"
|
||||
|
||||
@@ -288,7 +288,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
var/captainless=1
|
||||
for(var/mob/living/carbon/human/player in player_list)
|
||||
if(player && player.mind && player.mind.assigned_role)
|
||||
if(player.mind.assigned_role == "Captain")
|
||||
if(player.mind.assigned_role == "Station Administrator")
|
||||
captainless=0
|
||||
if(!player_is_antag(player.mind, only_offstation_roles = 1))
|
||||
job_master.EquipRank(player, player.mind.assigned_role, 0)
|
||||
@@ -297,7 +297,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
if(captainless)
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
M << "Captainship not forced on anyone."
|
||||
M << "Station Administratorship not forced on anyone."
|
||||
|
||||
|
||||
proc/process()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
only hope this unknown assassin isn't here for you."
|
||||
config_tag = "ninja"
|
||||
required_players = 1
|
||||
required_players_secret = 1
|
||||
required_players_secret = 3
|
||||
required_enemies = 1
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_NINJA)
|
||||
@@ -8,6 +8,5 @@
|
||||
required_enemies = 3
|
||||
auto_recall_shuttle = 0 //un-wanted on polaris
|
||||
end_on_antag_death = 0
|
||||
shuttle_delay = 3
|
||||
antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST)
|
||||
require_all_templates = 1
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
#define ALL_SPELLS "All"
|
||||
#define OFFENSIVE_SPELLS "Offensive"
|
||||
#define DEFENSIVE_SPELLS "Defensive"
|
||||
#define UTILITY_SPELLS "Utility"
|
||||
#define SUPPORT_SPELLS "Support"
|
||||
|
||||
var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell
|
||||
var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment
|
||||
var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable
|
||||
var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance
|
||||
var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datum/technomancer/presets
|
||||
|
||||
/datum/technomancer
|
||||
var/name = "technomancer thing"
|
||||
@@ -13,6 +18,9 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
var/obj_path = null
|
||||
var/ability_icon_state = null
|
||||
|
||||
/datum/technomancer/spell
|
||||
var/category = ALL_SPELLS
|
||||
|
||||
/obj/item/weapon/technomancer_catalog
|
||||
name = "catalog"
|
||||
desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \
|
||||
@@ -27,8 +35,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
var/list/equipment_instances = list()
|
||||
var/list/consumable_instances = list()
|
||||
var/list/assistance_instances = list()
|
||||
var/list/preset_instances = list()
|
||||
var/tab = 0
|
||||
var/spell_tab = ALL_SPELLS
|
||||
var/show_scepter_text = 0
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/apprentice
|
||||
@@ -72,15 +80,23 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
if(!assistance_instances.len)
|
||||
for(var/A in all_technomancer_assistance)
|
||||
assistance_instances += new A()
|
||||
if(!preset_instances.len)
|
||||
for(var/P in all_technomancer_presets)
|
||||
preset_instances += new P()
|
||||
|
||||
/obj/item/weapon/technomancer_catalog/apprentice/set_up()
|
||||
..()
|
||||
for(var/datum/technomancer/assistance/apprentice/A in assistance_instances)
|
||||
assistance_instances.Remove(A)
|
||||
|
||||
// Proc: show_categories()
|
||||
// Parameters: 1 (category - the category link to display)
|
||||
// Description: Shows an href link to go to a spell subcategory if the category is not already selected, otherwise is bold, to reduce
|
||||
// code duplicating.
|
||||
/obj/item/weapon/technomancer_catalog/proc/show_categories(var/category)
|
||||
if(category)
|
||||
if(spell_tab != category)
|
||||
return "<a href='byond://?src=\ref[src];spell_category=[category]'>[category]</a>"
|
||||
else
|
||||
return "<b>[category]</b>"
|
||||
|
||||
// Proc: attack_self()
|
||||
// Parameters: 1 (user - the mob clicking on the catelog)
|
||||
// Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used.
|
||||
@@ -100,13 +116,17 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
dat += "<align='center'><b>Functions</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];refund_functions=1'>Refund Functions</a><br><br>"
|
||||
for(var/datum/technomancer/spell in spell_instances)
|
||||
|
||||
dat += "[show_categories(ALL_SPELLS)] | [show_categories(OFFENSIVE_SPELLS)] | [show_categories(DEFENSIVE_SPELLS)] | \
|
||||
[show_categories(UTILITY_SPELLS)] | [show_categories(SUPPORT_SPELLS)]<br>"
|
||||
for(var/datum/technomancer/spell/spell in spell_instances)
|
||||
if(spell.hidden)
|
||||
continue
|
||||
if(spell_tab != ALL_SPELLS && spell.category != spell_tab)
|
||||
continue
|
||||
dat += "<b>[spell.name]</b><br>"
|
||||
dat += "<i>[spell.desc]</i><br>"
|
||||
if(show_scepter_text)
|
||||
@@ -123,8 +143,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<b>Equipment</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/equipment/E in equipment_instances)
|
||||
dat += "<b>[E.name]</b><br>"
|
||||
@@ -141,8 +160,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<b>Consumables</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/consumable/C in consumable_instances)
|
||||
dat += "<b>[C.name]</b><br>"
|
||||
@@ -159,8 +177,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<b>Assistance</b> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=4'>Presets</a></align><br>"
|
||||
dat += "<b>Assistance</b></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/assistance/A in assistance_instances)
|
||||
dat += "<b>[A.name]</b><br>"
|
||||
@@ -171,24 +188,6 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
if(4) //Presets
|
||||
var/dat = ""
|
||||
user.set_machine(src)
|
||||
dat += "<align='center'><a href='byond://?src=\ref[src];tab_choice=0'>Functions</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=1'>Equipment</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=2'>Consumables</a> | "
|
||||
dat += "<a href='byond://?src=\ref[src];tab_choice=3'>Assistance</a> | "
|
||||
dat += "<b>Presets</b></align><br>"
|
||||
dat += "You currently have a budget of <b>[budget]/[max_budget]</b>.<br><br>"
|
||||
for(var/datum/technomancer/presets/P in preset_instances)
|
||||
dat += "<b>[P.name]</b><br>"
|
||||
dat += "<i>[P.desc]</i><br>"
|
||||
if(P.cost <= budget)
|
||||
dat += "<a href='byond://?src=\ref[src];spell_choice=[P.name]'>Purchase</a> ([P.cost])<br><br>"
|
||||
else
|
||||
dat += "<font color='red'><b>Cannot afford!</b></font><br><br>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
|
||||
// Proc: Topic()
|
||||
// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.)
|
||||
@@ -210,6 +209,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
H.set_machine(src)
|
||||
if(href_list["tab_choice"])
|
||||
tab = text2num(href_list["tab_choice"])
|
||||
if(href_list["spell_category"])
|
||||
spell_tab = href_list["spell_category"]
|
||||
if(href_list["spell_choice"])
|
||||
var/datum/technomancer/new_spell = null
|
||||
//Locate the spell.
|
||||
@@ -269,4 +270,4 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
|
||||
budget += spell_datum.cost
|
||||
core.remove_spell(spell)
|
||||
break
|
||||
attack_self(H)
|
||||
attack_self(H)
|
||||
|
||||
@@ -212,4 +212,4 @@
|
||||
outgoing_instability = outgoing_instability * armor_factor
|
||||
H.adjust_instability(outgoing_instability)
|
||||
|
||||
set_light(distance, distance, l_color = "#C26DDE")
|
||||
set_light(distance, distance * 2, l_color = "#C26DDE")
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
far away from the caster. Failing that, it may inhibit those entities in some form."
|
||||
cost = 40
|
||||
obj_path = /obj/item/weapon/spell/abjuration
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/abjuration
|
||||
name = "abjuration"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
will grab them automatically."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/apportation
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/apportation
|
||||
name = "apportation"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/audible_deception
|
||||
ability_icon_state = "tech_audibledeception"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/audible_deception
|
||||
name = "audible deception"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/aura/biomed
|
||||
ability_icon_state = "tech_biomedaura"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/aura/biomed
|
||||
name = "restoration aura"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/aura/fire
|
||||
ability_icon_state = "tech_fireaura"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/aura/fire
|
||||
name = "Fire Storm"
|
||||
@@ -20,7 +21,6 @@
|
||||
qdel(src)
|
||||
var/list/nearby_things = range(4,owner)
|
||||
|
||||
var/fire_prob = 10
|
||||
var/temp_change = 25
|
||||
var/temp_cap = 500
|
||||
var/fire_power = 2
|
||||
@@ -28,7 +28,6 @@
|
||||
if(check_for_scepter())
|
||||
temp_change = 50
|
||||
temp_cap = 700
|
||||
fire_prob = 25
|
||||
fire_power = 4
|
||||
for(var/mob/living/carbon/human/H in nearby_things)
|
||||
if(is_ally(H))
|
||||
@@ -41,16 +40,11 @@
|
||||
|
||||
turf_check:
|
||||
for(var/turf/simulated/T in nearby_things)
|
||||
if(prob(fire_prob))
|
||||
if(prob(30))
|
||||
for(var/mob/living/carbon/human/H in T)
|
||||
if(is_ally(H))
|
||||
continue turf_check
|
||||
T.hotspot_expose(1000, 50, 1)
|
||||
T.create_fire(fire_power)
|
||||
|
||||
|
||||
// //We use hotspot_expose() to allow firesuits to protect from this aura.
|
||||
// var/turf/location = get_turf(H)
|
||||
// location.hotspot_expose(1000, 50, 1)
|
||||
|
||||
owner.adjust_instability(1)
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/aura/frost
|
||||
ability_icon_state = "tech_frostaura"
|
||||
category = DEFENSIVE_SPELLS // Scepter-less frost aura is nonlethal.
|
||||
|
||||
/obj/item/weapon/spell/aura/frost
|
||||
name = "chilling aura"
|
||||
@@ -35,8 +36,4 @@
|
||||
var/cold_factor = abs(protection - 1)
|
||||
H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap)
|
||||
|
||||
// //We use hotspot_expose() to allow firesuits to protect from this aura.
|
||||
// var/turf/location = get_turf(H)
|
||||
// location.hotspot_expose(1, 50, 1)
|
||||
|
||||
owner.adjust_instability(1)
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/aura/shock
|
||||
ability_icon_state = "tech_shockaura"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/aura/shock
|
||||
name = "electric aura"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/aura/unstable
|
||||
ability_icon_state = "tech_unstableaura"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/aura/unstable
|
||||
name = "degen aura"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
enhancement_desc = "Blink distance is increased greatly."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/blink
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/blink
|
||||
name = "blink"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
useful to trick someone into believing you're casting a different spell, or perhaps just for fun."
|
||||
cost = 25
|
||||
obj_path = /obj/item/weapon/spell/chroma
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/chroma
|
||||
name = "chroma"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
ability_icon_state = "tech_condensation"
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/condensation
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/condensation
|
||||
name = "condensation"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
around the entity is merely a hologram used to allow the user to know if the creature is safe or not."
|
||||
cost = 200
|
||||
obj_path = /obj/item/weapon/spell/control
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/mob/living/carbon/human/proc/technomancer_control()
|
||||
place_spell_in_hand(/obj/item/weapon/spell/control)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 25
|
||||
obj_path = /obj/item/weapon/spell/dispel
|
||||
ability_icon_state = "tech_dispel"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/dispel
|
||||
name = "dispel"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/energy_siphon
|
||||
ability_icon_state = "tech_energysiphon"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/energy_siphon
|
||||
name = "energy siphon"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/flame_tongue
|
||||
ability_icon_state = "tech_flametongue"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/flame_tongue
|
||||
name = "flame tongue"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
ability_icon_state = "tech_gambit"
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/gambit
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/var/global/list/all_technomancer_gambit_spells = typesof(/obj/item/weapon/spell) - list(
|
||||
/obj/item/weapon/spell,
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/illusion
|
||||
ability_icon_state = "tech_illusion"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/illusion
|
||||
name = "illusion"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/insert/corona
|
||||
ability_icon_state = "tech_corona"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/corona
|
||||
name = "corona"
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
/datum/technomancer/spell/haste
|
||||
name = "Haste"
|
||||
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For three seconds, the target \
|
||||
desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
|
||||
runs extremly fast, and cannot be slowed by any means."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/insert/haste
|
||||
ability_icon_state = "tech_haste"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/haste
|
||||
name = "haste"
|
||||
@@ -22,7 +23,7 @@
|
||||
L.force_max_speed = 1
|
||||
L << "<span class='notice'>You suddenly find it much easier to move.</span>"
|
||||
L.adjust_instability(10)
|
||||
spawn(3 SECONDS)
|
||||
spawn(5 SECONDS)
|
||||
if(src)
|
||||
on_expire()
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/insert/mend_burns
|
||||
ability_icon_state = "tech_mendburns"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/mend_burns
|
||||
name = "mend burns"
|
||||
@@ -19,10 +20,10 @@
|
||||
spawn(1)
|
||||
if(ishuman(host))
|
||||
var/mob/living/carbon/human/H = host
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
H.adjustFireLoss(-1)
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
H.adjustFireLoss(-5)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(10)
|
||||
on_expire()
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/insert/mend_metal
|
||||
ability_icon_state = "tech_mendwounds"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/mend_metal
|
||||
name = "mend metal"
|
||||
@@ -18,14 +19,14 @@
|
||||
spawn(1)
|
||||
if(ishuman(host))
|
||||
var/mob/living/carbon/human/H = host
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
if(O.robotic < ORGAN_ROBOT) // Robot parts only.
|
||||
continue
|
||||
O.heal_damage(1, 0, internal = 1, robo_repair = 1)
|
||||
O.heal_damage(5, 0, internal = 1, robo_repair = 1)
|
||||
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
sleep(10)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(1 SECOND)
|
||||
on_expire()
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 75
|
||||
obj_path = /obj/item/weapon/spell/insert/mend_organs
|
||||
ability_icon_state = "tech_mendwounds"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/mend_organs
|
||||
name = "mend organs"
|
||||
@@ -19,13 +20,13 @@
|
||||
spawn(1)
|
||||
if(ishuman(host))
|
||||
var/mob/living/carbon/human/H = host
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
for(var/obj/item/organ/O in H.internal_organs)
|
||||
if(O.damage > 0)
|
||||
O.damage = max(O.damage - 0.2, 0)
|
||||
O.damage = max(O.damage - 1, 0)
|
||||
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
sleep(10)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(1 SECOND)
|
||||
on_expire()
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/insert/mend_wires
|
||||
ability_icon_state = "tech_mendwounds"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/mend_wires
|
||||
name = "mend wires"
|
||||
@@ -19,14 +20,14 @@
|
||||
spawn(1)
|
||||
if(ishuman(host))
|
||||
var/mob/living/carbon/human/H = host
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
for(var/obj/item/organ/external/O in H.organs)
|
||||
if(O.robotic < ORGAN_ROBOT) // Robot parts only.
|
||||
continue
|
||||
O.heal_damage(0, 1, internal = 1, robo_repair = 1)
|
||||
O.heal_damage(0, 5, internal = 1, robo_repair = 1)
|
||||
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(10)
|
||||
on_expire()
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/insert/mend_wounds
|
||||
ability_icon_state = "tech_mendwounds"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/mend_wounds
|
||||
name = "mend wounds"
|
||||
@@ -19,10 +20,10 @@
|
||||
spawn(1)
|
||||
if(ishuman(host))
|
||||
var/mob/living/carbon/human/H = host
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
H.adjustBruteLoss(-1)
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
sleep(10)
|
||||
H.adjustBruteLoss(-5)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(1 SECOND)
|
||||
on_expire()
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
/datum/technomancer/spell/purify
|
||||
name = "Purify"
|
||||
desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, and such. \
|
||||
desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \
|
||||
Instability is split between the target and technomancer, if seperate."
|
||||
cost = 25
|
||||
obj_path = /obj/item/weapon/spell/insert/purify
|
||||
ability_icon_state = "tech_purify"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/purify
|
||||
name = "purify"
|
||||
@@ -23,12 +24,12 @@
|
||||
H.disabilities = 0
|
||||
// for(var/datum/disease/D in H.viruses)
|
||||
// D.cure()
|
||||
for(var/i = 0, i<25,i++)
|
||||
for(var/i = 0, i<5,i++)
|
||||
if(H)
|
||||
H.adjustToxLoss(-1)
|
||||
H.adjustCloneLoss(-1)
|
||||
H.radiation = max(host.radiation - 2, 0)
|
||||
H.adjust_instability(0.5)
|
||||
origin.adjust_instability(0.5)
|
||||
sleep(10)
|
||||
H.adjustToxLoss(-5)
|
||||
H.adjustCloneLoss(-5)
|
||||
H.radiation = max(host.radiation - 10, 0)
|
||||
H.adjust_instability(2.5)
|
||||
origin.adjust_instability(2.5)
|
||||
sleep(1 SECOND)
|
||||
on_expire()
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
/datum/technomancer/spell/repel_missiles
|
||||
name = "Repel Missiles"
|
||||
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
|
||||
to hit you. The field lasts for two minutes and can be granted to yourself or an ally."
|
||||
to hit you. The field lasts for five minutes and can be granted to yourself or an ally."
|
||||
cost = 60
|
||||
obj_path = /obj/item/weapon/spell/insert/repel_missiles
|
||||
ability_icon_state = "tech_repelmissiles"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/insert/repel_missiles
|
||||
name = "repel missiles"
|
||||
@@ -21,7 +22,7 @@
|
||||
var/mob/living/L = host
|
||||
L.evasion += 2
|
||||
L << "<span class='notice'>You have a repulsion field around you, which will attempt to deflect projectiles.</span>"
|
||||
spawn(2 MINUTES)
|
||||
spawn(5 MINUTES)
|
||||
if(src)
|
||||
on_expire()
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 120
|
||||
obj_path = /obj/item/weapon/spell/instability_tap
|
||||
ability_icon_state = "tech_instabilitytap"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/instability_tap
|
||||
name = "instability tap"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/mark
|
||||
ability_icon_state = "tech_mark"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
//The object to teleport to when Recall is used.
|
||||
/obj/effect/mark_spell
|
||||
@@ -52,6 +53,7 @@
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/recall
|
||||
ability_icon_state = "tech_recall"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/recall
|
||||
name = "recall"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 70
|
||||
obj_path = /obj/item/weapon/spell/oxygenate
|
||||
ability_icon_state = "oxygenate"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/oxygenate
|
||||
name = "oxygenate"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/passwall
|
||||
ability_icon_state = "tech_passwall"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/passwall
|
||||
name = "passwall"
|
||||
@@ -21,53 +22,55 @@
|
||||
if(!allowed_to_teleport())
|
||||
user << "<span class='warning'>You can't teleport here!</span>"
|
||||
return 0
|
||||
if(isturf(hit_atom))
|
||||
var/turf/T = hit_atom //Turf we touched.
|
||||
var/turf/our_turf = get_turf(user) //Where we are.
|
||||
if(!T.density)
|
||||
user << "<span class='warning'>Perhaps you should try using passWALL on a wall.</span>"
|
||||
// if(isturf(hit_atom))
|
||||
|
||||
var/turf/T = get_turf(hit_atom) //Turf we touched.
|
||||
var/turf/our_turf = get_turf(user) //Where we are.
|
||||
if(!T.density)
|
||||
if(!T.check_density())
|
||||
user << "<span class='warning'>Perhaps you should try using passWALL on a wall, or other solid object.</span>"
|
||||
return 0
|
||||
var/direction = get_dir(our_turf, T)
|
||||
var/total_cost = 0
|
||||
var/turf/checked_turf = T //Turf we're currently checking for density in the loop below.
|
||||
var/turf/found_turf = null //Our destination, if one is found.
|
||||
var/i = maximum_distance
|
||||
var/direction = get_dir(our_turf, T)
|
||||
var/total_cost = 0
|
||||
var/turf/checked_turf = T //Turf we're currently checking for density in the loop below.
|
||||
var/turf/found_turf = null //Our destination, if one is found.
|
||||
var/i = maximum_distance
|
||||
|
||||
visible_message("<span class='info'>[user] rests a hand on \the [T].</span>")
|
||||
busy = 1
|
||||
visible_message("<span class='info'>[user] rests a hand on \the [hit_atom].</span>")
|
||||
busy = 1
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
spark_system.set_up(5, 0, our_turf)
|
||||
var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
||||
spark_system.set_up(5, 0, our_turf)
|
||||
|
||||
while(i)
|
||||
checked_turf = get_step(checked_turf, direction) //Advance in the given direction
|
||||
total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know.
|
||||
i--
|
||||
if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop.
|
||||
var/dense_objs_on_turf = 0
|
||||
for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window.
|
||||
if(stuff.density)
|
||||
dense_objs_on_turf = 1
|
||||
while(i)
|
||||
checked_turf = get_step(checked_turf, direction) //Advance in the given direction
|
||||
total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know.
|
||||
i--
|
||||
if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop.
|
||||
var/dense_objs_on_turf = 0
|
||||
for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window.
|
||||
if(stuff.density)
|
||||
dense_objs_on_turf = 1
|
||||
|
||||
if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination.
|
||||
found_turf = checked_turf
|
||||
break
|
||||
sleep(10)
|
||||
if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination.
|
||||
found_turf = checked_turf
|
||||
break
|
||||
sleep(10)
|
||||
|
||||
if(found_turf)
|
||||
if(user.loc != our_turf)
|
||||
user << "<span class='warning'>You need to stand still in order to phase through the wall.</span>"
|
||||
return 0
|
||||
if(pay_energy(total_cost) && !user.incapacitated() )
|
||||
visible_message("<span class='warning'>[user] appears to phase through \the [T]!</span>")
|
||||
user << "<span class='info'>You find a destination on the other side of \the [T], and phase through it.</span>"
|
||||
spark_system.start()
|
||||
user.forceMove(found_turf)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
user << "<span class='warning'>You don't have enough energy to phase through these walls!</span>"
|
||||
busy = 0
|
||||
if(found_turf)
|
||||
if(user.loc != our_turf)
|
||||
user << "<span class='warning'>You need to stand still in order to phase through \the [hit_atom].</span>"
|
||||
return 0
|
||||
if(pay_energy(total_cost) && !user.incapacitated() )
|
||||
visible_message("<span class='warning'>[user] appears to phase through \the [hit_atom]!</span>")
|
||||
user << "<span class='info'>You find a destination on the other side of \the [hit_atom], and phase through it.</span>"
|
||||
spark_system.start()
|
||||
user.forceMove(found_turf)
|
||||
qdel(src)
|
||||
return 1
|
||||
else
|
||||
user << "<span class='info'>You weren't able to find an open space to go to.</span>"
|
||||
user << "<span class='warning'>You don't have enough energy to phase through these walls!</span>"
|
||||
busy = 0
|
||||
else
|
||||
user << "<span class='info'>You weren't able to find an open space to go to.</span>"
|
||||
busy = 0
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
draining your powercell."
|
||||
cost = 80
|
||||
obj_path = /obj/item/weapon/spell/phase_shift
|
||||
category = DEFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/phase_shift
|
||||
name = "phase shift"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 150
|
||||
ability_icon_state = "tech_beam"
|
||||
obj_path = /obj/item/weapon/spell/projectile/beam
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/beam
|
||||
name = "beam"
|
||||
@@ -12,12 +13,13 @@
|
||||
cast_methods = CAST_RANGED
|
||||
aspect = ASPECT_LIGHT
|
||||
spell_projectile = /obj/item/projectile/beam/blue
|
||||
energy_cost_per_shot = 500
|
||||
energy_cost_per_shot = 400
|
||||
instability_per_shot = 3
|
||||
cooldown = 10
|
||||
fire_sound = 'sound/weapons/Laser.ogg'
|
||||
|
||||
/obj/item/projectile/beam/blue
|
||||
damage = 20
|
||||
damage = 30
|
||||
|
||||
muzzle_type = /obj/effect/projectile/laser_blue/muzzle
|
||||
tracer_type = /obj/effect/projectile/laser_blue/tracer
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
strike up to four targets, including yourself if conditions allow it to occur."
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/projectile/chain_lightning
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/chain_lightning
|
||||
name = "chain lightning"
|
||||
@@ -16,6 +17,7 @@
|
||||
energy_cost_per_shot = 3000
|
||||
instability_per_shot = 10
|
||||
cooldown = 20
|
||||
fire_sound = 'sound/weapons/gauss_shoot.ogg'
|
||||
|
||||
/obj/item/projectile/beam/chain_lightning
|
||||
name = "lightning"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
that armor designed to protect from blunt force will mitigate this function as well."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/projectile/force_missile
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/force_missile
|
||||
name = "force missile"
|
||||
@@ -12,13 +13,14 @@
|
||||
cast_methods = CAST_RANGED
|
||||
aspect = ASPECT_FORCE
|
||||
spell_projectile = /obj/item/projectile/force_missile
|
||||
energy_cost_per_shot = 400
|
||||
energy_cost_per_shot = 300
|
||||
instability_per_shot = 2
|
||||
cooldown = 10
|
||||
cooldown = 5
|
||||
fire_sound = 'sound/weapons/wave.ogg'
|
||||
|
||||
/obj/item/projectile/force_missile
|
||||
name = "force missile"
|
||||
icon_state = "force_missile"
|
||||
damage = 20
|
||||
damage = 25
|
||||
damage_type = BRUTE
|
||||
check_armour = "melee"
|
||||
@@ -5,6 +5,7 @@
|
||||
strike."
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/projectile/lightning
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/lightning
|
||||
name = "lightning strike"
|
||||
@@ -16,7 +17,8 @@
|
||||
energy_cost_per_shot = 2500
|
||||
instability_per_shot = 10
|
||||
cooldown = 20
|
||||
pre_shot_delay = 20
|
||||
pre_shot_delay = 10
|
||||
fire_sound = 'sound/weapons/gauss_shoot.ogg'
|
||||
|
||||
/obj/item/projectile/beam/lightning
|
||||
name = "lightning"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
This energy pierces all known armor."
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/projectile/overload
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/projectile/overload
|
||||
name = "overload"
|
||||
@@ -13,9 +14,10 @@
|
||||
aspect = ASPECT_UNSTABLE
|
||||
spell_projectile = /obj/item/projectile/overload
|
||||
energy_cost_per_shot = 0 // Handled later
|
||||
instability_per_shot = 15
|
||||
instability_per_shot = 12
|
||||
cooldown = 10
|
||||
pre_shot_delay = 4
|
||||
fire_sound = 'sound/effects/supermatter.ogg'
|
||||
|
||||
/obj/item/projectile/overload
|
||||
name = "overloaded bolt"
|
||||
@@ -25,15 +27,15 @@
|
||||
armor_penetration = 100
|
||||
|
||||
/obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user)
|
||||
energy_cost_per_shot = round(core.max_energy * 0.15)
|
||||
energy_cost_per_shot = round(core.max_energy * 0.10)
|
||||
var/energy_before_firing = core.energy
|
||||
if(set_up(hit_atom, user))
|
||||
var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user))
|
||||
P.launch(hit_atom)
|
||||
if(check_for_scepter())
|
||||
P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool.
|
||||
P.damage = round(energy_before_firing * 0.004) // 4% of their current energy pool.
|
||||
else
|
||||
P.damage = round(energy_before_firing * 0.002) // 2% of their current energy pool.
|
||||
P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool.
|
||||
owner.adjust_instability(instability_per_shot)
|
||||
return 1
|
||||
|
||||
|
||||
@@ -7,12 +7,15 @@
|
||||
var/energy_cost_per_shot = 0
|
||||
var/instability_per_shot = 0
|
||||
var/pre_shot_delay = 0
|
||||
var/fire_sound = null
|
||||
|
||||
/obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
|
||||
var/turf/T = get_turf(hit_atom)
|
||||
if(set_up(hit_atom, user))
|
||||
var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user))
|
||||
new_projectile.launch(T)
|
||||
if(fire_sound)
|
||||
playsound(get_turf(src), fire_sound, 75, 1)
|
||||
owner.adjust_instability(instability_per_shot)
|
||||
return 1
|
||||
return 0
|
||||
@@ -23,7 +26,7 @@
|
||||
if(pre_shot_delay)
|
||||
var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target")
|
||||
user << target_image
|
||||
user.Stun(pre_shot_delay)
|
||||
user.Stun(pre_shot_delay / 10)
|
||||
sleep(pre_shot_delay)
|
||||
qdel(target_image)
|
||||
return 1
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation."
|
||||
cost = 180
|
||||
obj_path = /obj/item/weapon/spell/radiance
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/radiance
|
||||
name = "radiance"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 120
|
||||
obj_path = /obj/item/weapon/spell/reflect
|
||||
ability_icon_state = "tech_reflect"
|
||||
category = DEFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/reflect
|
||||
name = "\proper reflect shield"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/resurrect
|
||||
ability_icon_state = "tech_resurrect"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/resurrect
|
||||
name = "resurrect"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/shared_burden
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/shared_burden
|
||||
name = "shared burden"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 120
|
||||
obj_path = /obj/item/weapon/spell/shield
|
||||
ability_icon_state = "tech_shield"
|
||||
category = DEFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/shield
|
||||
name = "\proper energy shield"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Disrupts photons moving in a local area, causing darkness to shroud yourself or a position of your choosing."
|
||||
cost = 30
|
||||
obj_path = /obj/item/weapon/spell/spawner/darkness
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/spawner/darkness
|
||||
name = "darkness"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
sure to not be close to the disturbance yourself."
|
||||
cost = 175
|
||||
obj_path = /obj/item/weapon/spell/spawner/fire_blast
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/spawner/fire_blast
|
||||
name = "fire blast"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
desc = "Emits electronic pulses to destroy, disable, or otherwise harm devices and machines. Be sure to not hit yourself with this."
|
||||
cost = 150
|
||||
obj_path = /obj/item/weapon/spell/spawner/pulsar
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/spawner/pulsar
|
||||
name = "pulsar"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
enhancement_desc = "Summoned entities will never harm their summoner."
|
||||
cost = 200
|
||||
obj_path = /obj/item/weapon/spell/summon/summon_creature
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/summon/summon_creature
|
||||
name = "summon creature"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/summon/summon_ward
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/summon/summon_ward
|
||||
name = "summon ward"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
cost = 150
|
||||
ability_icon_state = "tech_targetingmatrix"
|
||||
obj_path = /obj/item/weapon/spell/targeting_matrix
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/targeting_matrix
|
||||
name = "targeting matrix"
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
desc = "Acts as directional guidance towards an object that belongs to you or your team. It can also point towards your allies. \
|
||||
Wonderful if you're worried someone will steal your valuables, like a certain shiny Scepter..."
|
||||
enhancement_desc = "You will be able to track most other entities in addition to your belongings and allies."
|
||||
cost = 30
|
||||
cost = 25
|
||||
obj_path = /obj/item/weapon/spell/track
|
||||
ability_icon_state = "tech_track"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
// This stores a ref to all important items that belong to a Technomancer, in case of theft. Used by the spell below.
|
||||
// I feel dirty for adding yet another global list used by one thing, but the only alternative is to loop through world, and yeahhh.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
cost = 200
|
||||
obj_path = /obj/item/weapon/spell/warp_strike
|
||||
ability_icon_state = "tech_warpstrike"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/warp_strike
|
||||
name = "warp strike"
|
||||
|
||||
@@ -23,5 +23,6 @@
|
||||
config_tag = "autotraitor"
|
||||
antag_tags = list(MODE_AUTOTRAITOR)
|
||||
round_autoantag = 1
|
||||
required_players_secret = 1
|
||||
required_players_secret = 0
|
||||
required_enemies = 0
|
||||
antag_scaling_coeff = 5
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
config_tag = "wizard"
|
||||
votable = 0
|
||||
required_players = 1
|
||||
required_players_secret = 1
|
||||
required_players_secret = 3
|
||||
required_enemies = 1
|
||||
end_on_antag_death = 0
|
||||
antag_tags = list(MODE_WIZARD)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user