mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-21 12:08:55 +01:00
Fixes merge conflicts
This commit is contained in:
@@ -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)
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
|
||||
@@ -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"]))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user