Fixes merge conflicts

This commit is contained in:
Shadowlight213
2016-07-22 01:04:45 -07:00
210 changed files with 17715 additions and 13714 deletions
+55
View File
@@ -0,0 +1,55 @@
/mob/living/carbon/human/virtual_reality
var/mob/living/carbon/human/real_me //The human controlling us, can be any human (including virtual ones... inception...)
var/obj/machinery/vr_sleeper/vr_sleeper
var/datum/action/quit_vr/quit_action
/mob/living/carbon/human/virtual_reality/New()
..()
quit_action = new()
quit_action.Grant(src)
/mob/living/carbon/human/virtual_reality/death()
revert_to_reality()
..()
/mob/living/carbon/human/virtual_reality/Destroy()
revert_to_reality()
return ..()
/mob/living/carbon/human/virtual_reality/ghost()
set category = "OOC"
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
var/mob/living/carbon/human/H = real_me
revert_to_reality(FALSE, FALSE)
if(H)
H.ghost()
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(refcleanup = TRUE, deathchecks = TRUE)
if(real_me && mind)
mind.transfer_to(real_me)
if(deathchecks && vr_sleeper && vr_sleeper.you_die_in_the_game_you_die_for_real)
real_me.death(0)
if(refcleanup)
vr_sleeper.vr_human = null
vr_sleeper = null
real_me = null
/datum/action/quit_vr
name = "Quit Virtual Reality"
/datum/action/quit_vr/Trigger()
if(..())
if(istype(owner, /mob/living/carbon/human/virtual_reality))
var/mob/living/carbon/human/virtual_reality/VR = owner
VR.revert_to_reality(FALSE, FALSE)
else
Remove(owner)
+184
View File
@@ -0,0 +1,184 @@
//Glorified teleporter that puts you in a new human body.
// it's """VR"""
/obj/machinery/vr_sleeper
name = "virtual reality sleeper"
desc = "a sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
var/static/list/available_vr_spawnpoints
var/vr_category = "default" //Specific category of spawn points to pick from
var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
var/outfit = /datum/outfit/vr_basic
/obj/machinery/vr_sleeper/New()
..()
sparks = new /datum/effect_system/spark_spread()
sparks.set_up(2,0)
sparks.attach(src)
update_icon()
if(!available_vr_spawnpoints || !available_vr_spawnpoints.len) //(re)build spawnpoint lists
available_vr_spawnpoints = list()
for(var/obj/effect/landmark/vr_spawn/V in landmarks_list)
available_vr_spawnpoints[V.vr_category] = list()
var/turf/T = get_turf(V)
if(T)
available_vr_spawnpoints[V.vr_category] |= T
/obj/machinery/vr_sleeper/attack_hand(mob/user)
if(occupant)
ui_interact(user)
else
if(state_open)
close_machine()
else
open_machine()
/obj/machinery/vr_sleeper/relaymove(mob/user)
open_machine()
/obj/machinery/vr_sleeper/Destroy()
open_machine()
cleanup_vr_human()
qdel(sparks)
sparks = null
return ..()
/obj/machinery/vr_sleeper/emag_act(mob/user)
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
/obj/machinery/vr_sleeper/update_icon()
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
/obj/machinery/vr_sleeper/open_machine()
if(!state_open)
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
if(occupant)
SStgui.close_user_uis(occupant, src)
..()
/obj/machinery/vr_sleeper/close_machine()
..()
if(occupant)
ui_interact(occupant)
/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state)
ui.open()
/obj/machinery/vr_sleeper/ui_act(action, params)
if(..())
return
switch(action)
if("vr_connect")
if(ishuman(occupant) && occupant.mind)
occupant << "<span class='warning'>Transfering to virtual reality...</span>"
if(vr_human)
vr_human.revert_to_reality(FALSE, FALSE)
occupant.mind.transfer_to(vr_human)
vr_human.real_me = occupant
vr_human << "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>"
SStgui.close_user_uis(vr_human, src)
else
if(allow_creating_vr_humans)
occupant << "<span class='warning'>Virtual avatar not found, attempting to create one...</span>"
var/turf/T = get_vr_spawnpoint()
if(T)
build_virtual_human(occupant, T)
vr_human << "<span class='notice'>Transfer successful! you are now playing as [vr_human] in VR!</span>"
else
occupant << "<span class='warning'>Virtual world misconfigured, aborting transfer</span>"
else
occupant << "<span class='warning'>The virtual world does not support the creation of new virtual avatars, aborting transfer</span>"
. = TRUE
if("delete_avatar")
if(!occupant || usr == occupant)
if(vr_human)
qdel(vr_human)
else
usr << "<span class='warning'>The VR Sleeper's safeties prevent you from doing that."
. = TRUE
if("toggle_open")
if(state_open)
close_machine()
else
open_machine()
. = TRUE
/obj/machinery/vr_sleeper/ui_data(mob/user)
var/list/data = list()
if(vr_human && !qdeleted(vr_human))
data["can_delete_avatar"] = TRUE
var/status
switch(user.stat)
if(CONSCIOUS)
status = "Conscious"
if(DEAD)
status = "Dead"
if(UNCONSCIOUS)
status = "Unconscious"
data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth)
data["toggle_open"] = state_open
data["isoccupant"] = (user == occupant)
return data
/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overriden for team games or something
return safepick(available_vr_spawnpoints[vr_category])
/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, transfer = TRUE)
if(H)
cleanup_vr_human()
vr_human = new /mob/living/carbon/human/virtual_reality(location)
vr_human.vr_sleeper = src
vr_human.real_me = H
H.dna.transfer_identity(vr_human)
vr_human.name = H.name
vr_human.real_name = H.real_name
vr_human.socks = H.socks
vr_human.undershirt = H.undershirt
vr_human.underwear = H.underwear
vr_human.updateappearance(1,1,1)
if(outfit)
var/datum/outfit/O = new outfit()
O.equip(vr_human)
if(transfer && H.mind)
H.mind.transfer_to(vr_human)
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
if(vr_human)
vr_human.death(0)
/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint()
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
/datum/outfit/vr_basic
name = "basic vr"
uniform = /obj/item/clothing/under/color/random
shoes = /obj/item/clothing/shoes/sneakers/black
+1 -1
View File
@@ -115,7 +115,7 @@
var/mob/living/silicon/robot/R = M
add_logs(user, R, "flashed", src)
update_icon(1)
M.Weaken(3)
M.Weaken(6)
R.confused += 5
R.flash_eyes(affect_silicon = 1)
user.visible_message("<span class='disarm'>[user] overloads [R]'s sensors with the flash!</span>", "<span class='danger'>You overload [R]'s sensors with the flash!</span>")
+17 -6
View File
@@ -78,7 +78,7 @@ var/list/preferences_datums = list()
var/job_engsec_low = 0
// Want randomjob if preferences already filled - Donkie
var/userandomjob = 1 //defaults to 1 for fewer assistants
var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants
// 0 = character settings, 1 = game preferences
var/current_tab = 0
@@ -551,7 +551,12 @@ var/list/preferences_datums = list()
HTML += "</center></table>"
HTML += "<center><br><a href='?_src_=prefs;preference=job;task=random'>[userandomjob ? "Get random job if preferences unavailable" : "Be an Assistant if preference unavailable"]</a></center>"
var/message = "Be an Assistant if preferences unavailable"
if(joblessrole == BERANDOMJOB)
message = "Get random job if preferences unavailable"
else if(joblessrole == RETURNTOLOBBY)
message = "Return to lobby if preferences unavailable"
HTML += "<center><br><a href='?_src_=prefs;preference=job;task=random'>[message]</a></center>"
HTML += "<center><a href='?_src_=prefs;preference=job;task=reset'>Reset Preferences</a></center>"
user << browse(null, "window=preferences")
@@ -726,10 +731,16 @@ var/list/preferences_datums = list()
ResetJobs()
SetChoices(user)
if("random")
if(jobban_isbanned(user, "Assistant"))
userandomjob = 1
else
userandomjob = !userandomjob
switch(joblessrole)
if(RETURNTOLOBBY)
if(jobban_isbanned(user, "Assistant"))
joblessrole = BERANDOMJOB
else
joblessrole = BEASSISTANT
if(BEASSISTANT)
joblessrole = BERANDOMJOB
if(BERANDOMJOB)
joblessrole = RETURNTOLOBBY
SetChoices(user)
if("setJobLevel")
UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
+20 -69
View File
@@ -1,8 +1,8 @@
//This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped.
#define SAVEFILE_VERSION_MIN 8
#define SAVEFILE_VERSION_MIN 10
//This is the current version, anything below this will attempt to update (if it's not obsolete)
#define SAVEFILE_VERSION_MAX 15
#define SAVEFILE_VERSION_MAX 16
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating
@@ -31,7 +31,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
return -1
/datum/preferences/proc/update_antagchoices(current_version)
/datum/preferences/proc/update_antagchoices(current_version, savefile/S)
if((!islist(be_special) || old_be_special ) && current_version < 12)
//Archived values of when antag pref defines were a bitfield+fitflags
var/B_traitor = 1
@@ -87,7 +87,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
be_special += ROLE_ABDUCTOR
/datum/preferences/proc/update_preferences(current_version)
/datum/preferences/proc/update_preferences(current_version, savefile/S)
if(current_version < 10)
toggles |= MEMBER_PUBLIC
if(current_version < 11)
@@ -97,6 +97,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
ignoring = list()
if(current_version < 15)
toggles |= SOUND_ANNOUNCEMENTS
//should this proc get fairly long (say 3 versions long),
//just increase SAVEFILE_VERSION_MIN so it's not as far behind
@@ -104,65 +105,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//from this proc.
//It's only really meant to avoid annoying frequent players
//if your savefile is 3 months out of date, then 'tough shit'.
/datum/preferences/proc/update_character(current_version)
if(current_version < 9) //an example, underwear were an index for a hardcoded list, converting to a string
if(gender == MALE)
switch(underwear)
if(1)
underwear = "Mens White"
if(2)
underwear = "Mens Grey"
if(3)
underwear = "Mens Green"
if(4)
underwear = "Mens Blue"
if(5)
underwear = "Mens Black"
if(6)
underwear = "Mankini"
if(7)
underwear = "Mens Hearts Boxer"
if(8)
underwear = "Mens Black Boxer"
if(9)
underwear = "Mens Grey Boxer"
if(10)
underwear = "Mens Striped Boxer"
if(11)
underwear = "Mens Kinky"
if(12)
underwear = "Mens Red"
if(13)
underwear = "Nude"
else
switch(underwear)
if(1)
underwear = "Ladies Red"
if(2)
underwear = "Ladies White"
if(3)
underwear = "Ladies Yellow"
if(4)
underwear = "Ladies Blue"
if(5)
underwear = "Ladies Black"
if(6)
underwear = "Ladies Thong"
if(7)
underwear = "Babydoll"
if(8)
underwear = "Ladies Baby-Blue"
if(9)
underwear = "Ladies Green"
if(10)
underwear = "Ladies Pink"
if(11)
underwear = "Ladies Kinky"
if(12)
underwear = "Tankini"
if(13)
underwear = "Nude"
/datum/preferences/proc/update_character(current_version, savefile/S)
if(pref_species && !(pref_species.id in roundstart_species))
var/rando_race = pick(config.roundstart_races)
pref_species = new rando_race()
@@ -173,6 +116,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
backbag = DSATCHEL
else
backbag = DBACKPACK
if(current_version < 16)
var/berandom
S["userandomjob"] >> berandom
if (berandom)
joblessrole = BERANDOMJOB
else
joblessrole = BEASSISTANT
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
@@ -223,8 +174,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//try to fix any outdated data if necessary
if(needs_update >= 0)
update_preferences(needs_update) //needs_update = savefile_version if we need an update (positive integer)
update_antagchoices(needs_update)
update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer)
update_antagchoices(needs_update, S)
//Sanitize
ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor)))
@@ -346,7 +297,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["deity_name"] >> custom_names["deity"]
//Jobs
S["userandomjob"] >> userandomjob
S["joblessrole"] >> joblessrole
S["job_civilian_high"] >> job_civilian_high
S["job_civilian_med"] >> job_civilian_med
S["job_civilian_low"] >> job_civilian_low
@@ -359,7 +310,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//try to fix any outdated data if necessary
if(needs_update >= 0)
update_character(needs_update) //needs_update == savefile_version if we need an update (positive integer)
update_character(needs_update, S) //needs_update == savefile_version if we need an update (positive integer)
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -398,7 +349,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["spines"] = sanitize_inlist(features["spines"], spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
@@ -456,7 +407,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["deity_name"] << custom_names["deity"]
//Jobs
S["userandomjob"] << userandomjob
S["joblessrole"] << joblessrole
S["job_civilian_high"] << job_civilian_high
S["job_civilian_med"] << job_civilian_med
S["job_civilian_low"] << job_civilian_low
+1 -1
View File
@@ -291,7 +291,7 @@
var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src)
randomise_action.UpdateButtonIcon()
/obj/item/clothing/mask/chameleon/attack_self(mob/user)
/obj/item/clothing/mask/chameleon/drone/attack_self(mob/user)
user << "<span class='notice'>The [src] does not have a voice changer.</span>"
/obj/item/clothing/shoes/chameleon
+85
View File
@@ -0,0 +1,85 @@
//BeanieStation13 Redux
/obj/item/clothing/head/beanie //Default is white, this is meant to be seen
name = "white beanie"
desc = "A stylish beanie. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their heads."
icon_state = "beanie" //Default white
item_color = "white"
/obj/item/clothing/head/beanie/black
name = "black beanie"
icon_state = "white"
color = "#4A4A4B" //Grey but it looks black
item_color = "black"
/obj/item/clothing/head/beanie/red
name = "red beanie"
icon_state = "beanie"
color = "#D91414" //Red
item_color = "red"
/obj/item/clothing/head/beanie/green
name = "green beanie"
icon_state = "beanie"
color = "#5C9E54" //Green
item_color = "green"
/obj/item/clothing/head/beanie/blue
name = "blue beanie"
icon_state = "beanie"
color = "#1E85BC" //Blue
item_color = "blue"
/obj/item/clothing/head/beanie/purple
name = "purple beanie"
icon_state = "beanie"
color = "#9557C5" //purple
item_color = "purple"
/obj/item/clothing/head/beanie/yellow
name = "yellow beanie"
icon_state = "beanie"
color = "#E0C14F" //Yellow
item_color = "yellow"
/obj/item/clothing/head/beanie/orange
name = "orange beanie"
icon_state = "beanie"
color = "#C67A4B" //orange
item_color = "orange"
/obj/item/clothing/head/beanie/cyan
name = "cyan beanie"
icon_state = "beanie"
color = "#54A3CE" //Cyan (Or close to it)
item_color = "cyan"
//Striped Beanies have unique sprites
/obj/item/clothing/head/beanie/christmas
name = "christmas beanie"
icon_state = "beaniechristmas"
item_color = "beaniechristmas"
/obj/item/clothing/head/beanie/striped
name = "striped beanie"
icon_state = "beaniestriped"
item_color = "beaniestriped"
/obj/item/clothing/head/beanie/stripedred
name = "red striped beanie"
icon_state = "beaniestripedred"
item_color = "beaniestripedred"
/obj/item/clothing/head/beanie/stripedblue
name = "blue striped beanie"
icon_state = "beaniestripedblue"
item_color = "beaniestripedblue"
/obj/item/clothing/head/beanie/stripedgreen
name = "green striped beanie"
icon_state = "beaniestripedgreen"
item_color = "beaniestripedgreen"
//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
+2 -2
View File
@@ -49,10 +49,10 @@
can_toggle = 1
flags = HEADBANGPROTECT
armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE
flags_inv = HIDEEARS|HIDEFACE
strip_delay = 80
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEFACE
visor_flags_inv = HIDEFACE
toggle_cooldown = 0
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
dog_fashion = null
+1 -1
View File
@@ -173,7 +173,7 @@
glasses = /obj/item/clothing/glasses/sunglasses
belt = /obj/item/weapon/gun/energy/gun
l_pocket = /obj/item/weapon/pen
back = /obj/item/weapon/storage/backpack/satchel_norm
back = /obj/item/weapon/storage/backpack/satchel
r_pocket = /obj/item/device/pda/heads
l_hand = /obj/item/weapon/clipboard
id = /obj/item/weapon/card/id
+3 -3
View File
@@ -194,7 +194,7 @@
belt = /obj/item/weapon/gun/projectile/revolver/mateba
r_pocket = /obj/item/weapon/lighter
l_pocket = /obj/item/ammo_box/a357
back = /obj/item/weapon/storage/backpack/satchel
back = /obj/item/weapon/storage/backpack/satchel/leather
id = /obj/item/weapon/card/id
/datum/outfit/centcom_commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -222,7 +222,7 @@
head = /obj/item/clothing/head/helmet/space/beret
belt = /obj/item/weapon/gun/energy/pulse/pistol/m1911
r_pocket = /obj/item/weapon/lighter
back = /obj/item/weapon/storage/backpack/satchel
back = /obj/item/weapon/storage/backpack/satchel/leather
id = /obj/item/weapon/card/id
/datum/outfit/spec_ops/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -278,7 +278,7 @@
ears = /obj/item/device/radio/headset/headset_cent
glasses = /obj/item/clothing/glasses/thermal/eyepatch
suit = /obj/item/clothing/suit/pirate/captain
back = /obj/item/weapon/storage/backpack/satchel
back = /obj/item/weapon/storage/backpack/satchel/leather
belt = /obj/item/weapon/gun/projectile/revolver/mateba
id = /obj/item/weapon/card/id
+33
View File
@@ -148,3 +148,36 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
burn_state = FLAMMABLE
/obj/item/clothing/suit/wizrobe/paper
name = "papier-mâché robe"
desc = "A robe held together by various bits of clear-tape and paste."
icon_state = "wizard-paper"
item_state = "wizrobe"
var/robe_charge = TRUE
actions_types = list(/datum/action/item_action/stickmen)
/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, actiontype)
stickmen()
/obj/item/clothing/suit/wizrobe/paper/verb/stickmen()
set category = "Object"
set name = "Summon Stick Minions"
set src in usr
if(!istype(usr, /mob/living))
return
if(!robe_charge)
usr << "<span class='warning'>\The robe's internal magic supply is still recharging!</span>"
return
usr.say("Rise, my creation! Off your page into this realm!")
playsound(src.loc, 'sound/magic/Summon_Magic.ogg', 50, 1, 1)
var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr))
var/list/factions = usr.faction
M.faction = factions
src.robe_charge = FALSE
sleep(30)
src.robe_charge = TRUE
usr << "<span class='notice'>\The robe hums, its internal magic supply restored.</span>"
+9 -15
View File
@@ -7,7 +7,7 @@
var/displayed_text
var/atom/attached_to
var/text_color = "#ff0000"
color = "#ff0000"
var/text_size = 4
var/started = FALSE
invisibility = INVISIBILITY_OBSERVER
@@ -29,7 +29,7 @@
/obj/effect/countdown/proc/stop()
if(started)
overlays.Cut()
maptext = null
STOP_PROCESSING(SSfastprocess, src)
started = FALSE
@@ -47,15 +47,9 @@
displayed_text = new_val
if(displayed_text)
var/image/text_image = new(loc = src)
//text_image.maptext = "<font size=[text_size]>[new_val]</font>"
text_image.maptext = "<font size = [text_size]>[displayed_text]</font>"
text_image.color = text_color
overlays.Cut()
overlays += text_image
maptext = "<font size = [text_size]>[displayed_text]</font>"
else
overlays.Cut()
maptext = null
/obj/effect/countdown/Destroy()
attached_to = null
@@ -74,7 +68,7 @@
/obj/effect/countdown/nuclearbomb
name = "nuclear bomb countdown"
text_color = "#81FF14"
color = "#81FF14"
/obj/effect/countdown/nuclearbomb/get_value()
var/obj/machinery/nuclearbomb/N = attached_to
@@ -85,7 +79,7 @@
/obj/effect/countdown/clonepod
name = "cloning pod countdown"
text_color = "#0C479D"
color = "#0C479D"
text_size = 1
/obj/effect/countdown/clonepod/get_value()
@@ -99,7 +93,7 @@
/obj/effect/countdown/dominator
name = "dominator countdown"
text_size = 1
text_color = "#ff00ff" // Overwritten when the dominator starts
color = "#ff00ff" // Overwritten when the dominator starts
/obj/effect/countdown/dominator/get_value()
var/obj/machinery/dominator/D = attached_to
@@ -114,7 +108,7 @@
/obj/effect/countdown/clockworkgate
name = "gateway countdown"
text_size = 1
text_color = "#BE8700"
color = "#BE8700"
layer = POINT_LAYER
/obj/effect/countdown/clockworkgate/get_value()
@@ -126,7 +120,7 @@
/obj/effect/countdown/transformer
name = "transformer countdown"
text_color = "#4C5866"
color = "#4C5866"
/obj/effect/countdown/transformer/get_value()
var/obj/machinery/transformer/T = attached_to
+1 -1
View File
@@ -1,7 +1,7 @@
/datum/round_event_control/meteor_wave/major_dust
name = "Major Space Dust"
typepath = /datum/round_event/meteor_wave/major_dust
weight = 30
weight = 8
/datum/round_event/meteor_wave/major_dust
wave_name = "space dust"
+2 -2
View File
@@ -3,7 +3,7 @@
/datum/round_event_control/meteor_wave
name = "Meteor Wave: Normal"
typepath = /datum/round_event/meteor_wave
weight = 5
weight = 4
min_players = 5
max_occurrences = 3
@@ -50,7 +50,7 @@
/datum/round_event_control/meteor_wave/threatening
name = "Meteor Wave: Threatening"
typepath = /datum/round_event/meteor_wave/threatening
weight = 4
weight = 2
min_players = 5
max_occurrences = 3
+2 -2
View File
@@ -24,7 +24,7 @@
bitesize_mod = 2
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/kitchen/knife) || istype(I, /obj/item/weapon/hatchet))
if(I.is_sharp())
user << "<span class='notice'>You sharpen the carrot into a shiv with [I].</span>"
var/obj/item/weapon/kitchen/knife/carrotshiv/Shiv = new /obj/item/weapon/kitchen/knife/carrotshiv
if(!remove_item_from_storage(user))
@@ -100,4 +100,4 @@
name = "red beet"
desc = "You can't beat red beet."
icon_state = "redbeet"
bitesize_mod = 2
bitesize_mod = 2
+1 -1
View File
@@ -38,7 +38,7 @@ Captain
backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1, /obj/item/station_charter=1)
backpack = /obj/item/weapon/storage/backpack/captain
satchel = /obj/item/weapon/storage/backpack/satchel_cap
satchel = /obj/item/weapon/storage/backpack/satchel/cap
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/captain
/datum/outfit/job/captain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+2 -2
View File
@@ -89,7 +89,7 @@ Shaft Miner
/obj/item/weapon/mining_voucher=1)
backpack = /obj/item/weapon/storage/backpack/explorer
satchel = /obj/item/weapon/storage/backpack/satchel_explorer
satchel = /obj/item/weapon/storage/backpack/satchel/explorer
dufflebag = /obj/item/weapon/storage/backpack/dufflebag
box = /obj/item/weapon/storage/box/survival_mining
@@ -199,7 +199,7 @@ Botanist
suit_store = /obj/item/device/plant_analyzer
backpack = /obj/item/weapon/storage/backpack/botany
satchel = /obj/item/weapon/storage/backpack/satchel_hyd
satchel = /obj/item/weapon/storage/backpack/satchel/hyd
/*
+2 -1
View File
@@ -30,7 +30,8 @@ Clown
/obj/item/weapon/stamp/clown = 1,
/obj/item/weapon/reagent_containers/spray/waterflower = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/device/megaphone/clown = 1
/obj/item/device/megaphone/clown = 1,
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/canned_laughter = 1
)
backpack = /obj/item/weapon/storage/backpack/clown
+3 -3
View File
@@ -39,7 +39,7 @@ Chief Engineer
backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1)
backpack = /obj/item/weapon/storage/backpack/industrial
satchel = /obj/item/weapon/storage/backpack/satchel_eng
satchel = /obj/item/weapon/storage/backpack/satchel/eng
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering
box = /obj/item/weapon/storage/box/engineer
pda_slot = slot_l_store
@@ -85,7 +85,7 @@ Station Engineer
r_pocket = /obj/item/device/t_scanner
backpack = /obj/item/weapon/storage/backpack/industrial
satchel = /obj/item/weapon/storage/backpack/satchel_eng
satchel = /obj/item/weapon/storage/backpack/satchel/eng
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering
box = /obj/item/weapon/storage/box/engineer
pda_slot = slot_l_store
@@ -120,7 +120,7 @@ Atmospheric Technician
r_pocket = /obj/item/device/analyzer
backpack = /obj/item/weapon/storage/backpack/industrial
satchel = /obj/item/weapon/storage/backpack/satchel_eng
satchel = /obj/item/weapon/storage/backpack/satchel/eng
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/engineering
box = /obj/item/weapon/storage/box/engineer
pda_slot = slot_l_store
+3 -3
View File
@@ -141,7 +141,7 @@
shoes = /obj/item/clothing/shoes/sneakers/black
var/backpack = /obj/item/weapon/storage/backpack
var/satchel = /obj/item/weapon/storage/backpack/satchel_norm
var/satchel = /obj/item/weapon/storage/backpack/satchel
var/dufflebag = /obj/item/weapon/storage/backpack/dufflebag
var/box = /obj/item/weapon/storage/box/survival
@@ -152,11 +152,11 @@
if(GBACKPACK)
back = /obj/item/weapon/storage/backpack //Grey backpack
if(GSATCHEL)
back = /obj/item/weapon/storage/backpack/satchel_norm //Grey satchel
back = /obj/item/weapon/storage/backpack/satchel //Grey satchel
if(GDUFFLEBAG)
back = /obj/item/weapon/storage/backpack/dufflebag //Grey Dufflebag
if(LSATCHEL)
back = /obj/item/weapon/storage/backpack/satchel //Leather Satchel
back = /obj/item/weapon/storage/backpack/satchel/leather //Leather Satchel
if(DSATCHEL)
back = satchel //Department satchel
if(DDUFFLEBAG)
+5 -5
View File
@@ -37,7 +37,7 @@ Chief Medical Officer
backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1)
backpack = /obj/item/weapon/storage/backpack/medic
satchel = /obj/item/weapon/storage/backpack/satchel_med
satchel = /obj/item/weapon/storage/backpack/satchel/med
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med
/datum/outfit/job/cmo/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
@@ -79,7 +79,7 @@ Medical Doctor
suit_store = /obj/item/device/flashlight/pen
backpack = /obj/item/weapon/storage/backpack/medic
satchel = /obj/item/weapon/storage/backpack/satchel_med
satchel = /obj/item/weapon/storage/backpack/satchel/med
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med
/*
@@ -112,7 +112,7 @@ Chemist
suit = /obj/item/clothing/suit/toggle/labcoat/chemist
backpack = /obj/item/weapon/storage/backpack/chemistry
satchel = /obj/item/weapon/storage/backpack/satchel_chem
satchel = /obj/item/weapon/storage/backpack/satchel/chem
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med
/*
@@ -145,7 +145,7 @@ Geneticist
suit_store = /obj/item/device/flashlight/pen
backpack = /obj/item/weapon/storage/backpack/genetics
satchel = /obj/item/weapon/storage/backpack/satchel_gen
satchel = /obj/item/weapon/storage/backpack/satchel/gen
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med
/*
@@ -179,5 +179,5 @@ Virologist
suit_store = /obj/item/device/flashlight/pen
backpack = /obj/item/weapon/storage/backpack/virology
satchel = /obj/item/weapon/storage/backpack/satchel_vir
satchel = /obj/item/weapon/storage/backpack/satchel/vir
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/med
+3 -3
View File
@@ -41,7 +41,7 @@ Research Director
backpack_contents = list(/obj/item/weapon/melee/classic_baton/telescopic=1)
backpack = /obj/item/weapon/storage/backpack/science
satchel = /obj/item/weapon/storage/backpack/satchel_tox
satchel = /obj/item/weapon/storage/backpack/satchel/tox
/datum/outfit/job/rd/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
@@ -80,7 +80,7 @@ Scientist
suit = /obj/item/clothing/suit/toggle/labcoat/science
backpack = /obj/item/weapon/storage/backpack/science
satchel = /obj/item/weapon/storage/backpack/satchel_tox
satchel = /obj/item/weapon/storage/backpack/satchel/tox
/*
Roboticist
@@ -111,6 +111,6 @@ Roboticist
suit = /obj/item/clothing/suit/toggle/labcoat
backpack = /obj/item/weapon/storage/backpack/science
satchel = /obj/item/weapon/storage/backpack/satchel_tox
satchel = /obj/item/weapon/storage/backpack/satchel/tox
pda_slot = slot_l_store
+3 -3
View File
@@ -49,7 +49,7 @@ Head of Security
backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
satchel = /obj/item/weapon/storage/backpack/satchel/sec
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/sec
box = /obj/item/weapon/storage/box/security
@@ -107,7 +107,7 @@ Warden
backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
satchel = /obj/item/weapon/storage/backpack/satchel/sec
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/sec
box = /obj/item/weapon/storage/box/security
@@ -217,7 +217,7 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science")
backpack_contents = list(/obj/item/weapon/melee/baton/loaded=1)
backpack = /obj/item/weapon/storage/backpack/security
satchel = /obj/item/weapon/storage/backpack/satchel_sec
satchel = /obj/item/weapon/storage/backpack/satchel/sec
dufflebag = /obj/item/weapon/storage/backpack/dufflebag/sec
box = /obj/item/weapon/storage/box/security
+23 -8
View File
@@ -246,10 +246,27 @@
anchored = 1
/atom/movable/light/Destroy(force)
if(force)
. = ..()
else
if(!force)
return QDEL_HINT_LETMELIVE
var/turf/T = loc
. = ..()
if (T.lighting_object == src)
T.lighting_object = null
/atom/movable/light/New()
if (!isturf(loc))
PutOut()
throw EXCEPTION("Invalid light placement: loc must be a turf")
var/turf/T = loc
if (T.lighting_object && T.lighting_object != src)
PutOut()
throw EXCEPTION("BUG: /atom/movable/light created on a turf that already has one")
T.lighting_object = src
/atom/movable/light/proc/PutOut()
alpha = 0
qdel(src, force = TRUE)
/atom/movable/light/Move()
return 0
@@ -288,6 +305,7 @@
update_lumcount(old_lumcount)
baseturf = oldbaseturf
lighting_object = locate() in src
init_lighting()
for(var/turf/open/space/S in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm
@@ -308,9 +326,7 @@
if(lighting_changed)
lighting_changed = 0
if(lighting_object)
lighting_object.alpha = 0
qdel(lighting_object)
lighting_object = null
lighting_object.PutOut()
else
if(!lighting_object)
lighting_object = new (src)
@@ -323,8 +339,7 @@
if(lighting_changed)
lighting_changed = 0
if(lighting_object)
lighting_object.alpha = 0
lighting_object = null
lighting_object.PutOut()
/turf/proc/redraw_lighting(instantly = 0)
if(lighting_object)
+1 -1
View File
@@ -18,7 +18,7 @@
contents = list()
new /obj/item/weapon/storage/backpack/dufflebag(src)
new /obj/item/weapon/storage/backpack/explorer(src)
new /obj/item/weapon/storage/backpack/satchel_explorer(src)
new /obj/item/weapon/storage/backpack/satchel/explorer(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
+59 -45
View File
@@ -61,7 +61,7 @@
/turf/closed/mineral/random
var/mineralSpawnChanceList = list(
/turf/closed/mineral/uranium = 5, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 10,
/turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 10,
/turf/closed/mineral/silver = 12, /turf/closed/mineral/plasma = 20, /turf/closed/mineral/iron = 40, /turf/closed/mineral/titanium = 11,
/turf/closed/mineral/gibtonite = 4, /turf/open/floor/plating/asteroid/airless/cave = 2, /turf/closed/mineral/bscrystal = 1)
//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 13
@@ -86,7 +86,7 @@
icon_state = "rock_highchance"
mineralChance = 25
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium = 35, /turf/closed/mineral/diamond = 30, /turf/closed/mineral/gold = 45,
/turf/closed/mineral/uranium = 35, /turf/closed/mineral/diamond = 30, /turf/closed/mineral/gold = 45, /turf/closed/mineral/titanium = 45,
/turf/closed/mineral/silver = 50, /turf/closed/mineral/plasma = 50, /turf/closed/mineral/bscrystal = 20)
/turf/closed/mineral/random/high_chance/New()
@@ -97,7 +97,7 @@
icon_state = "rock_lowchance"
mineralChance = 6
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4,
/turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4,
/turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40,
/turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1)
@@ -575,41 +575,56 @@
var/drop_y = 1
var/drop_z = 1
/turf/open/chasm/Entered(atom/movable/AM)
if(istype(AM, /obj/singularity) || istype(AM, /obj/item/projectile))
return
START_PROCESSING(SSobj, src)
drop_stuff()
/turf/open/chasm/process()
if(!drop_stuff())
STOP_PROCESSING(SSobj, src)
/turf/open/chasm/proc/drop_stuff()
. = 0
for(var/thing in contents)
if(droppable(thing))
. = 1
drop(thing)
/turf/open/chasm/proc/droppable(atom/movable/AM)
if(!isliving(AM) && !isobj(AM))
return 0
if(istype(AM, /obj/singularity) || istype(AM, /obj/item/projectile) || AM.throwing)
return 0
if(istype(AM, /obj/effect/portal))
// Portals aren't affected by gravity. Probably.
return
// Flies right over the chasm
if(istype(AM, /mob/living/simple_animal))
// apparently only simple_animals can fly??
//Portals aren't affected by gravity. Probably.
return 0
//Flies right over the chasm
if(isanimal(AM))
var/mob/living/simple_animal/SA = AM
if(SA.flying)
return
if(istype(AM, /mob/living/carbon/human))
return 0
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if(istype(H.belt, /obj/item/device/wormhole_jaunter))
var/obj/item/device/wormhole_jaunter/J = H.belt
// To freak out any bystanders
//To freak out any bystanders
visible_message("<span class='boldwarning'>[H] falls into [src]!</span>")
J.chasm_react(H)
return
if(H.dna.species && (FLYING in H.dna.species.specflags))
return
drop(AM)
return 0
if(H.dna && H.dna.species && (FLYING in H.dna.species.specflags))
return 0
return 1
/turf/open/chasm/proc/drop(atom/movable/AM)
/*visible_message("[AM] falls into [src]!")
qdel(AM)*/
AM.forceMove(locate(drop_x, drop_y, drop_z))
AM.visible_message("<span class='boldwarning'>[AM] falls from above!</span>", "<span class='userdanger'>GAH! Ah... where are you?</span>")
if(istype(AM, /mob/living))
var/mob/living/L = AM
L.Weaken(5)
L.adjustBruteLoss(30)
var/turf/T = locate(drop_x, drop_y, drop_z)
if(T)
AM.visible_message("<span class='boldwarning'>[AM] falls into [src]!</span>", "<span class='userdanger'>GAH! Ah... where are you?</span>")
T.visible_message("<span class='boldwarning'>[AM] falls from above!</span>")
AM.forceMove(T)
if(isliving(AM))
var/mob/living/L = AM
L.Weaken(5)
L.adjustBruteLoss(30)
/turf/open/chasm/straight_down/New()
..()
@@ -636,22 +651,21 @@
initial_gas_mix = "o2=22;n2=82;TEMP=293.15"
/turf/open/chasm/straight_down/lava_land_surface/drop(atom/movable/AM)
if(!AM.invisibility)
AM.visible_message("<span class='boldwarning'>[AM] falls into [src]!</span>", "<span class='userdanger'>You stumble and stare into an abyss before you. It stares back, and you fall \
into the enveloping dark.</span>")
if(isliving(AM))
var/mob/living/L = AM
L.notransform = TRUE
L.Stun(10)
L.resting = TRUE
animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10)
for(var/i in 1 to 5)
AM.pixel_y--
sleep(2)
if(isrobot(AM))
var/mob/living/silicon/robot/S = AM
qdel(S.mmi)
qdel(AM)
AM.visible_message("<span class='boldwarning'>[AM] falls into [src]!</span>", "<span class='userdanger'>You stumble and stare into an abyss before you. It stares back, and you fall \
into the enveloping dark.</span>")
if(isliving(AM))
var/mob/living/L = AM
L.notransform = TRUE
L.Stun(10)
L.resting = TRUE
animate(AM, transform = matrix() - matrix(), alpha = 0, color = rgb(0, 0, 0), time = 10)
for(var/i in 1 to 5)
AM.pixel_y--
sleep(2)
if(isrobot(AM))
var/mob/living/silicon/robot/S = AM
qdel(S.mmi)
qdel(AM)
/turf/closed/mineral/volcanic/lava_land_surface
environment_type = "basalt"
@@ -668,7 +682,7 @@
mineralChance = 10
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/volcanic = 5, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 10,
/turf/closed/mineral/uranium/volcanic = 5, /turf/closed/mineral/diamond/volcanic = 1, /turf/closed/mineral/gold/volcanic = 10, /turf/closed/mineral/titanium/volcanic = 11,
/turf/closed/mineral/silver/volcanic = 12, /turf/closed/mineral/plasma/volcanic = 20, /turf/closed/mineral/iron/volcanic = 40,
/turf/closed/mineral/gibtonite/volcanic = 4, /turf/open/floor/plating/asteroid/airless/cave/volcanic = 1, /turf/closed/mineral/bscrystal/volcanic = 1)
@@ -679,7 +693,7 @@
initial_gas_mix = "o2=14;n2=23;TEMP=300"
defer_change = 1
mineralSpawnChanceList = list(
/turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45,
/turf/closed/mineral/uranium/volcanic = 35, /turf/closed/mineral/diamond/volcanic = 30, /turf/closed/mineral/gold/volcanic = 45, /turf/closed/mineral/titanium/volcanic = 45,
/turf/closed/mineral/silver/volcanic = 50, /turf/closed/mineral/plasma/volcanic = 50, /turf/closed/mineral/bscrystal/volcanic = 20)
/turf/open/floor/plating/lava/smooth/lava_land_surface
@@ -97,8 +97,9 @@
picked = TRUE
languages_spoken = RATVAR
languages_understood = HUMAN|RATVAR
health = 60
maxHealth = 60
pass_flags = PASSTABLE
health = 50
maxHealth = 50
hacked = 1
density = TRUE
ventcrawler = 0
@@ -0,0 +1,136 @@
/mob/living/simple_animal/hostile/boss
name = "A Perfectly Generic Boss Placeholder"
desc = ""
robust_searching = 1
stat_attack = 1
status_flags = 0
a_intent = "harm"
var/list/boss_abilities = list() //list of /datum/action/boss
var/datum/boss_active_timed_battle/atb
var/point_regen_delay = 1
/mob/living/simple_animal/hostile/boss/New()
..()
atb = new()
atb.point_regen_delay = point_regen_delay
atb.boss = src
for(var/ab in boss_abilities)
boss_abilities -= ab
var/datum/action/boss/AB = new ab()
AB.boss = src
AB.Grant(src)
boss_abilities += AB
atb.assign_abilities(boss_abilities)
/mob/living/simple_animal/hostile/boss/Destroy()
qdel(atb)
atb = null
for(var/ab in boss_abilities)
var/datum/action/boss/AB = ab
AB.boss = null
AB.Remove(src)
qdel(AB)
del(boss_abilities)
return ..()
//Action datum for bosses
//Override Trigger() as shown below to do things
/datum/action/boss
check_flags = AB_CHECK_CONSCIOUS //Incase the boss is given a player
var/boss_cost = 100 //Cost of usage for the boss' AI 1-100
var/usage_probability = 100
var/mob/living/simple_animal/hostile/boss/boss
var/boss_type = /mob/living/simple_animal/hostile/boss
var/needs_target = TRUE //Does the boss need to have a target? (Only matters for the AI)
var/say_when_triggered = "" //What does the boss Say() when the ability triggers?
/datum/action/boss/Trigger()
. = ..()
if(.)
if(!istype(boss, boss_type))
return 0
if(!boss.atb)
return 0
if(boss.atb.points < boss_cost)
return 0
if(!boss.client)
if(needs_target && !boss.target)
return 0
if(boss)
if(say_when_triggered)
boss.say(say_when_triggered)
if(!boss.atb.spend(boss_cost))
return 0
//Example:
/*
/datum/action/boss/selfgib/Trigger()
if(..())
boss.gib()
*/
//Designed for boss mobs only
/datum/boss_active_timed_battle
var/list/abilities //a list of /datum/action/boss owned by a boss mob
var/point_regen_delay = 5
var/points = 50 //1-100, start with 50 so we can use some abilities but not insta-buttfug somebody
var/next_point_time = 0
var/chance_to_hold_onto_points = 50
var/highest_cost = 0
var/mob/living/simple_animal/hostile/boss/boss
/datum/boss_active_timed_battle/New()
..()
SSobj.processing.Add(src)
/datum/boss_active_timed_battle/proc/assign_abilities(list/L)
if(!L)
return 0
abilities = L
for(var/ab in abilities)
var/datum/action/boss/AB = ab
if(AB.boss_cost > highest_cost)
highest_cost = AB.boss_cost
/datum/boss_active_timed_battle/proc/spend(cost)
if(cost <= points)
points = max(0,points-cost)
return 1
return 0
/datum/boss_active_timed_battle/proc/refund(cost)
points = min(points+cost, 100)
/datum/boss_active_timed_battle/process()
if(world.time >= next_point_time)
next_point_time = world.time + point_regen_delay
points = min(100, ++points) //has to be out of 100
if(abilities)
chance_to_hold_onto_points = highest_cost*0.5
if(points != 100 && prob(chance_to_hold_onto_points))
return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!)
if(!boss.client)
abilities = shuffle(abilities)
for(var/ab in abilities)
var/datum/action/boss/AB = ab
if(prob(AB.usage_probability) && AB.Trigger())
break
/datum/boss_active_timed_battle/Destroy()
abilities = null
SSobj.processing.Remove(src)
return ..()
@@ -0,0 +1,165 @@
//Paper Wizard Boss
/mob/living/simple_animal/hostile/boss/paper_wizard
name = "Mjor the Creative"
desc = "A wizard with a taste for the arts."
boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic)
faction = list("hostile","stickman")
del_on_death = TRUE
icon_state = "paperwizard"
ranged = 1
environment_smash = 0
minimum_distance = 3
retreat_distance = 3
melee_damage_lower = 10
melee_damage_upper = 20
health = 1000
maxHealth = 1000
loot = list(/obj/effect/overlay/temp/paperwiz_dying)
projectiletype = /obj/item/projectile/temp
projectilesound = 'sound/weapons/emitter.ogg'
attack_sound = 'sound/hallucinations/growl1.ogg'
var/list/copies = list()
//Summon Ability
//Lets the wizard summon his art to fight for him
/datum/action/boss/wizard_summon_minions
name = "Summon Minions"
button_icon_state = "art_summon"
usage_probability = 40
boss_cost = 30
boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
needs_target = FALSE
say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!"
/datum/action/boss/wizard_summon_minions/Trigger()
if(..())
var/list/minions = list(
/mob/living/simple_animal/hostile/stickman,
/mob/living/simple_animal/hostile/stickman/ranged,
/mob/living/simple_animal/hostile/stickman/dog)
var/list/directions = cardinal.Copy()
for(var/i in 1 to 3)
var/minions_chosen = pick_n_take(minions)
new minions_chosen (get_step(boss,pick_n_take(directions)))
//Mimic Ability
//Summons mimics of himself with magical papercraft
//Hitting a decoy hurts nearby people excluding the wizard himself
//Hitting the wizard himself destroys all decoys
/datum/action/boss/wizard_mimic
name = "Craft Mimicry"
button_icon_state = "mimic_summon"
usage_probability = 30
boss_cost = 40
boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard
say_when_triggered = ""
/datum/action/boss/wizard_mimic/Trigger()
if(..())
var/mob/living/target
if(!boss.client) //AI's target
target = boss.target
else //random mob
var/list/threats = boss.PossibleThreats()
if(threats.len)
target = pick(threats)
if(target)
var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss
var/directions = cardinal.Copy()
for(var/i in 1 to 3)
var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions)))
wiz.copies += C
C.original = wiz
C.say("My craft defines me, you could even say it IS me!")
wiz.say("My craft defines me, you could even say it IS me!")
wiz.forceMove(get_step(target,pick_n_take(directions)))
wiz.minimum_distance = 1 //so he doesn't run away and ruin everything
wiz.retreat_distance = 0
else
boss.atb.refund(boss_cost)
/mob/living/simple_animal/hostile/boss/paper_wizard/copy
desc = "tis a ruse!"
health = 1
maxHealth = 1
alpha = 200
boss_abilities = list()
melee_damage_lower = 1
melee_damage_upper = 5
minimum_distance = 0
retreat_distance = 0
ranged = 0
loot = list()
var/mob/living/simple_animal/hostile/boss/paper_wizard/original
//Hit a fake? eat pain!
/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount)
if(amount > 0) //damage
if(original)
original.minimum_distance = 3
original.retreat_distance = 3
original.copies -= src
for(var/c in original.copies)
qdel(c)
for(var/mob/living/L in range(5,src))
if(L == original || istype(L, type))
continue
L.adjustBruteLoss(50)
qdel(src)
else
..()
//Hit the real guy? copies go bai-bai
/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount)
if(amount > 0)//damage
minimum_distance = 3
retreat_distance = 3
for(var/copy in copies)
qdel(copy)
. = ..()
/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user)
..()
qdel(src) //I see through your ruse!
//fancy effects
/obj/effect/overlay/temp/paper_scatter
name = "scattering paper"
desc = "Pieces of paper scattering to the wind."
layer = ABOVE_OPEN_TURF_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "paper_scatter"
anchored = TRUE
duration = 5
randomdir = FALSE
/obj/effect/overlay/temp/paperwiz_dying
name = "craft portal"
desc = "A wormhole sucking the wizard into the void. Neat."
layer = ABOVE_OPEN_TURF_LAYER
icon = 'icons/effects/effects.dmi'
icon_state = "paperwiz_poof"
anchored = TRUE
duration = 18
randomdir = FALSE
/obj/effect/overlay/temp/paperwiz_dying/New()
..()
visible_message("<span class='boldannounce'>The wizard cries out in pain as a gate appears behind him, sucking him in!</span>")
playsound(get_turf(src),'sound/magic/MandSwap.ogg', 50, 1, 1)
playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, 1, 1)
spawn(16)
for(var/mob/M in range(7,src))
shake_camera(M, 7, 1)
playsound(get_turf(src),'sound/magic/Summon_Magic.ogg', 50, 1, 1)
new /obj/effect/overlay/temp/paper_scatter(src)
new /obj/item/clothing/suit/wizrobe/paper(src)
new /obj/item/clothing/head/collectable/paper(src)
@@ -0,0 +1,51 @@
/mob/living/simple_animal/hostile/stickman
name = "Angry Stick Man"
desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you."
icon_state = "stickman"
icon_living = "stickman"
icon_dead = "stickman_dead"
icon_gib = "syndicate_gib"
speak_chance = 0
turns_per_move = 5
response_help = "pokes"
response_disarm = "shoves"
response_harm = "hits"
speed = 0
stat_attack = 1
robust_searching = 1
environment_smash = 0
maxHealth = 100
health = 100
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_upper = 10
attacktext = "punches"
attack_sound = 'sound/weapons/punch1.ogg'
a_intent = "harm"
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
faction = list("hostile","stickman")
check_friendly_fire = 1
status_flags = CANPUSH
/mob/living/simple_animal/hostile/stickman/ranged
ranged = 1
retreat_distance = 5
minimum_distance = 5
icon_state = "stickmanranged"
icon_living = "stickmanranged"
casingtype = /obj/item/ammo_casing/c45nostamina
projectilesound = 'sound/misc/bang.ogg'
loot = list(/obj/item/weapon/gun/projectile/automatic/pistol/stickman)
/mob/living/simple_animal/hostile/stickman/dog
name = "Angry Stick Dog"
desc = "Stickman's best friend, if he could see him at least."
icon_state = "stickdog"
icon_living = "stickdog"
icon_dead = "stickdog_dead"
/mob/living/simple_animal/hostile/stickman/New()
..()
new /obj/effect/overlay/temp/paper_scatter(src)
@@ -595,8 +595,11 @@
//Dextrous simple mobs can use hands!
/mob/living/simple_animal/create_mob_hud()
if(client && !hud_used && dextrous)
hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style))
if(client && !hud_used)
if(dextrous)
hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style))
else
..()
/mob/living/simple_animal/OpenCraftingMenu()
if(dextrous)
+3 -1
View File
@@ -471,7 +471,9 @@
"<span class='notice'>You start adding cables to the APC frame...</span>")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20, target = src))
if (C.amount >= 10 && !terminal && opened && has_electronics != 2)
if (C.get_amount() < 10 || !C)
return
if (C.get_amount() >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if (prob(50) && electrocute_mob(usr, N, N))
+1 -1
View File
@@ -204,7 +204,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(GRAV_NEEDS_PLASTEEL)
if(istype(I, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/PS = I
if(PS.amount >= 10)
if(PS.get_amount() >= 10)
PS.use(10)
user << "<span class='notice'>You add the plating to the framework.</span>"
playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
+4 -2
View File
@@ -135,14 +135,16 @@
var/obj/item/stack/cable_coil/C = I
if(C.amount < 10)
if(C.get_amount() < 10)
user << "<span class='warning'>You need more wires!</span>"
return
user << "<span class='notice'>You start building the power terminal...</span>"
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20, target = src) && C.amount >= 10)
if(do_after(user, 20, target = src) && C.get_amount() >= 10)
if(C.get_amount() < 10 || !C)
return
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
if (prob(50) && electrocute_mob(usr, N, N)) //animate the electrocution if uncautious and unlucky
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
@@ -41,13 +41,13 @@
/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
user.visible_message("<span class='danger'>[user] fired a grenade!</span>", \
"<span class='danger'>You fire the grenade launcher!</span>")
var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
var/obj/item/weapon/grenade/F = grenades[1] //Now with less copypasta!
grenades -= F
F.loc = user.loc
F.throw_at_fast(target, 30, 2,user)
message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).")
F.active = 1
F.icon_state = initial(icon_state) + "_active"
F.icon_state = initial(F.icon_state) + "_active"
playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
addtimer(F, "prime", 15)
@@ -56,3 +56,21 @@
burst_size = 3
fire_delay = 2
actions_types = list(/datum/action/item_action/toggle_firemode)
/obj/item/weapon/gun/projectile/automatic/pistol/stickman
name = "flat gun"
desc = "A 2 dimensional gun.. what?"
icon_state = "flatgun"
origin_tech = "combat=3;materials=2;abductor=3"
/obj/item/weapon/gun/projectile/automatic/pistol/stickman/pickup(mob/living/user)
user << "<span class='notice'>As you try to pick up [src], it slips out of your grip..</span>"
if(prob(50))
user << "<span class='notice'>..and vanishes from your vision! Where the hell did it go?</span>"
user.unEquip(src)
qdel(src)
user.update_icons()
else
user << "<span class='notice'>..and falls into view. Whew, that was a close one.</span>"
user.unEquip(src)
@@ -110,6 +110,27 @@
. = 1
..()
/datum/reagent/consumable/laughter
name = "Laughter"
id = "laughter"
description = "Some say that this is the best medicine, but recent studies have proven that to be untrue."
metabolization_rate = INFINITY
color = "#FF4DD2"
/datum/reagent/consumable/laughter/on_mob_life(mob/living/M)
M.emote("laugh")
var/laughnum = rand(1,2)
if(M.gender == MALE)
if(laughnum == 1)
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
if(laughnum == 2)
playsound(get_turf(M), 'sound/voice/human/manlaugh2.ogg', 50, 1)
else if(M.gender == FEMALE)
playsound(get_turf(M), 'sound/voice/human/womanlaugh.ogg', 65, 1)
else//non-binary gender just sounds like a man
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
..()
/datum/reagent/consumable/potato_juice
name = "Potato Juice"
id = "potato"
@@ -181,7 +181,7 @@
else if(is_servant_of_ratvar(M) && prob(5))
switch(pick("speech", "message", "emote"))
if("speech")
clockwork_say(M, "...[pick("Ratvar... lbhe yvtug tebjf qnex...", "Jurer ner lbh, znfgr-e?", "Ur yvrf ehfgv'at va Reebe...", "Chetr nyy hagehguf-naq... naq... fbzrguv'at...")]")
clockwork_say(M, "...[text2ratvar(pick("Engine... your light grows dark...", "Where are you, master?", "He lies rusting in Error...", "Purge all untruths and... and... something..."))]")
if("message")
M << "<span class='boldwarning'>[pick("Ratvar's illumination of your mind has begun to flicker", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay", \
"You can't save him. Nothing can save him now", "It seems that Nar-Sie will triumph after all")].</span>"
@@ -270,7 +270,7 @@
id = "gygax_armor"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/gygax_armor
materials = list(MAT_METAL=10000,MAT_DIAMOND=10000)
materials = list(MAT_METAL=15000,MAT_DIAMOND=10000,MAT_TITANIUM=10000)
construction_time = 600
category = list("Gygax")
@@ -343,7 +343,7 @@
id = "durand_armor"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/durand_armor
materials = list(MAT_METAL=25000,MAT_URANIUM=30000)
materials = list(MAT_METAL=30000,MAT_URANIUM=25000,MAT_TITANIUM=20000)
construction_time = 600
category = list("Durand")
@@ -481,7 +481,7 @@
id = "phazon_armor"
build_type = MECHFAB
build_path = /obj/item/mecha_parts/part/phazon_armor
materials = list(MAT_METAL=25000,MAT_PLASMA=30000)
materials = list(MAT_METAL=25000,MAT_PLASMA=20000,MAT_TITANIUM=20000)
construction_time = 300
category = list("Phazon")
@@ -664,7 +664,7 @@
build_type = MECHFAB
build_path = /obj/item/borg/upgrade/lavaproof
req_tech = list("plasmatech" = 4, "materials" = 4, "engineering" = 4)
materials = list(MAT_METAL = 8000, MAT_PLASMA = 8000)
materials = list(MAT_METAL = 10000, MAT_PLASMA = 4000, MAT_TITANIUM = 5000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -52,7 +52,7 @@
id = "bluespace_cell"
req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 800, MAT_GOLD = 300, MAT_SILVER = 300, MAT_GLASS = 160, MAT_DIAMOND = 160)
materials = list(MAT_METAL = 800, MAT_GOLD = 120, MAT_SILVER = 150, MAT_GLASS = 160, MAT_DIAMOND = 160, MAT_TITANIUM = 300)
construction_time=100
build_path = /obj/item/weapon/stock_parts/cell/bluespace
category = list("Misc","Power Designs")
@@ -141,7 +141,7 @@
id = "femto_mani"
req_tech = list("materials" = 7, "programming" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 200, MAT_DIAMOND = 60)
materials = list(MAT_METAL = 200, MAT_DIAMOND = 30, MAT_TITANIUM = 30)
build_path = /obj/item/weapon/stock_parts/manipulator/femto
category = list("Stock Parts")
@@ -38,7 +38,7 @@
id = "nuclear_gun"
req_tech = list("combat" = 5, "magnets" = 5, "powerstorage" = 5)
build_type = PROTOLATHE
materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 4000)
materials = list(MAT_METAL = 10000, MAT_GLASS = 2000, MAT_URANIUM = 3000, MAT_TITANIUM = 1000)
build_path = /obj/item/weapon/gun/energy/gun/nuclear
category = list("Weapons")
@@ -48,7 +48,7 @@
id = "tele_shield"
req_tech = list("combat" = 4, "materials" = 3, "engineering" = 4)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000, MAT_GLASS = 5000, MAT_SILVER = 300)
materials = list(MAT_METAL = 4000, MAT_GLASS = 4000, MAT_SILVER = 300, MAT_TITANIUM = 200)
build_path = /obj/item/weapon/shield/riot/tele
category = list("Weapons")
@@ -163,7 +163,7 @@
id = "xray"
req_tech = list("combat" = 7, "magnets" = 5, "biotech" = 5, "powerstorage" = 4)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 10000, MAT_METAL = 5000)
materials = list(MAT_GOLD = 5000,MAT_URANIUM = 8000, MAT_METAL = 5000, MAT_TITANIUM = 2000)
build_path = /obj/item/weapon/gun/energy/xray
category = list("Weapons")
+1 -1
View File
@@ -33,7 +33,7 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/New()
..()
create_reagents(0)
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM))
materials = new(src, list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM))
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/protolathe(null)
B.apply_default_parts(src)
+12 -10
View File
@@ -62,11 +62,12 @@
break
else if(istype(item, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = item
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(!C.self_recharge)
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
C.charge = C.maxcharge
charged_item = C
break
@@ -75,11 +76,12 @@
for(I in item.contents)
if(istype(I, /obj/item/weapon/stock_parts/cell/))
var/obj/item/weapon/stock_parts/cell/C = I
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
if(!C.self_recharge)
if(prob(80))
C.maxcharge -= 200
if(C.maxcharge <= 1) //Div by 0 protection
C.maxcharge = 1
burnt_out = 1
C.charge = C.maxcharge
item.update_icon()
charged_item = item
+1 -1
View File
@@ -688,7 +688,7 @@ var/list/uplink_items = list() // Global list so we only initialize this once.
name = "Smuggler's Satchel"
desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \
your stolen goods. Comes with a crowbar and a floor tile inside."
item = /obj/item/weapon/storage/backpack/satchel_flat
item = /obj/item/weapon/storage/backpack/satchel/flat
cost = 2
surplus = 30
+5 -1
View File
@@ -104,11 +104,13 @@
else if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
if(M.amount < 5)
if(M.get_amount() < 5)
user << "<span class='warning'>You need at least five metal sheets to make proper wheels!</span>"
return
user << "<span class='notice'>You begin to add wheels to [src].</span>"
if(do_after(user, 80, target = src))
if(!M || M.get_amount() < 5)
return
M.use(5)
user << "<span class='notice'>You finish making wheels for [src].</span>"
new /obj/vehicle/scooter/skateboard(user.loc)
@@ -131,6 +133,8 @@
return
user << "<span class='notice'>You begin making handlebars for [src].</span>"
if(do_after(user, 25, target = src))
if(!C || C.get_amount() < 2)
return
user << "<span class='notice'>You add the rods to [src], creating handlebars.</span>"
C.use(2)
new/obj/vehicle/scooter(get_turf(src))