mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-05-18 06:29:01 +01:00
474 lines
14 KiB
Plaintext
474 lines
14 KiB
Plaintext
// Added an option to send them to the arrival shuttle. Also runtime checks (Convair880).
|
|
/mob/proc/humanize(var/tele_to_arrival_shuttle = 0, var/equip_rank = 1)
|
|
if (src.transforming)
|
|
return
|
|
|
|
var/currentLoc = src.loc
|
|
var/ASLoc = pick(latejoin)
|
|
|
|
// They could be in a pod or whatever, which would have unfortunate results when respawned.
|
|
if (!isturf(src.loc))
|
|
if (!ASLoc)
|
|
return
|
|
else
|
|
tele_to_arrival_shuttle = 1
|
|
|
|
var/mob/living/carbon/human/character = new (currentLoc)
|
|
if (character && istype(character))
|
|
if (character.gender == "female") // Randomize_look() seems to cause runtimes when called before organs are initialized.
|
|
character.real_name = pick(first_names_female)+" "+pick(last_names)
|
|
else
|
|
character.real_name = pick(first_names_male)+" "+pick(last_names)
|
|
|
|
if (src.mind)
|
|
src.mind.transfer_to(character)
|
|
if (equip_rank == 1)
|
|
character.Equip_Rank("Staff Assistant", 1)
|
|
|
|
if (!tele_to_arrival_shuttle || (tele_to_arrival_shuttle && !ASLoc))
|
|
character.set_loc(currentLoc)
|
|
else
|
|
character.set_loc(ASLoc)
|
|
|
|
src.loc = null // Same as wraith/blob creation proc. Trying to narrow down a bug which
|
|
var/this = src // inexplicably (and without runtimes) caused another proc to fail, and
|
|
src = null // might as well give this a try. I suppose somebody else ran into the same problem?
|
|
qdel(this)
|
|
return character
|
|
|
|
else
|
|
if (!src.client) // NPC fallback, mostly.
|
|
character = new /mob/living/carbon/human
|
|
character.key = src.key
|
|
if (src.mind)
|
|
src.mind.transfer_to(character)
|
|
|
|
if (!tele_to_arrival_shuttle || (tele_to_arrival_shuttle && !ASLoc))
|
|
character.set_loc(currentLoc)
|
|
else
|
|
character.set_loc(ASLoc)
|
|
|
|
src.loc = null
|
|
var/this = src
|
|
src = null
|
|
qdel(this)
|
|
return character
|
|
|
|
var/mob/new_player/respawned = new() // C&P from respawn_target(), which couldn't be adapted easily.
|
|
respawned.key = src.key
|
|
if (src.mind)
|
|
src.mind.transfer_to(respawned)
|
|
respawned.Login()
|
|
respawned.sight = SEE_TURFS //otherwise the HUD remains in the login screen
|
|
|
|
src.loc = null
|
|
var/this = src
|
|
src = null
|
|
qdel(this)
|
|
|
|
logTheThing("debug", respawned, null, "Humanize() failed. Player was respawned instead.")
|
|
message_admins("Humanize() failed. [key_name(respawned)] was respawned instead.")
|
|
respawned.show_text("Humanize: an error occurred and you have been respawned instead. Please report this to a coder.", "red")
|
|
|
|
return respawned
|
|
|
|
return
|
|
|
|
/mob/living/carbon/human/proc/monkeyize()
|
|
if (src.transforming || !src.bioHolder)
|
|
return
|
|
if (iswizard(src))
|
|
src.visible_message("<span style=\"color:red\"><b>[src] magically resists being transformed!</b></span>")
|
|
return
|
|
|
|
src.unequip_all()
|
|
|
|
src.bioHolder.AddEffect("monkey")
|
|
return
|
|
|
|
/mob/new_player/AIize(var/mobile=0)
|
|
src.spawning = 1
|
|
..()
|
|
return
|
|
|
|
/mob/living/carbon/AIize(var/mobile=0)
|
|
if (src.transforming)
|
|
return
|
|
src.unequip_all()
|
|
src.transforming = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
for(var/t in src.organs)
|
|
qdel(src.organs[text("[]", t)])
|
|
|
|
return ..()
|
|
|
|
/mob/proc/AIize(var/mobile=0, var/do_not_move = 0)
|
|
src.client.screen.len = null
|
|
var/mob/living/silicon/ai/O
|
|
if (mobile)
|
|
O = new /mob/living/silicon/ai/mobile( src.loc )
|
|
else
|
|
O = new /mob/living/silicon/ai( src.loc )
|
|
|
|
O.invisibility = 0
|
|
O.canmove = 0
|
|
O.name = src.name
|
|
O.real_name = src.real_name
|
|
O.anchored = 1
|
|
O.aiRestorePowerRoutine = 0
|
|
O.lastKnownIP = src.client.address
|
|
|
|
mind.transfer_to(O)
|
|
mind.assigned_role = "AI"
|
|
|
|
if (!mobile && !do_not_move)
|
|
var/obj/loc_landmark
|
|
loc_landmark = locate(text("start*AI"))
|
|
|
|
if(loc_landmark && loc_landmark.loc)
|
|
O.set_loc(loc_landmark.loc)
|
|
|
|
boutput(O, "<B>You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras).</B>")
|
|
boutput(O, "<B>To look at other parts of the station, double-click yourself to get a camera menu.</B>")
|
|
boutput(O, "<B>While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc.</B>")
|
|
boutput(O, "To use something, simply double-click it.")
|
|
boutput(O, "Currently right-click functions will not work for the AI (except examine), and will either be replaced with dialogs or won't be usable by the AI.")
|
|
|
|
// O.laws_object = new /datum/ai_laws/asimov
|
|
// O.laws_object = ticker.centralized_ai_laws
|
|
// O.current_law_set = O.laws_object
|
|
ticker.centralized_ai_laws.show_laws(O)
|
|
boutput(O, "<b>These laws may be changed by other players, or by you being the traitor.</b>")
|
|
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_call_shuttle
|
|
O.verbs += /mob/living/silicon/ai/proc/show_laws_verb
|
|
O.verbs += /mob/living/silicon/ai/proc/de_electrify_verb
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_camera_track
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_alerts
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_camera_list
|
|
// See file code/game/verbs/ai_lockdown.dm for next two
|
|
//O.verbs += /mob/living/silicon/ai/proc/lockdown
|
|
//O.verbs += /mob/living/silicon/ai/proc/disablelockdown
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_statuschange
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_state_laws_all
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_state_laws_standard
|
|
//O.verbs += /mob/living/silicon/ai/proc/ai_toggle_arrival_alerts
|
|
//O.verbs += /mob/living/silicon/ai/proc/ai_custom_arrival_alert
|
|
// O.verbs += /mob/living/silicon/ai/proc/hologramize
|
|
O.verbs += /mob/living/silicon/ai/verb/deploy_to
|
|
// O.verbs += /mob/living/silicon/ai/proc/ai_cancel_call
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_view_crew_manifest
|
|
O.verbs += /mob/living/silicon/ai/proc/toggle_alerts_verb
|
|
O.verbs += /mob/living/silicon/ai/verb/access_internal_radio
|
|
O.verbs += /mob/living/silicon/ai/verb/access_internal_pda
|
|
O.verbs += /mob/living/silicon/ai/proc/ai_colorchange
|
|
O.job = "AI"
|
|
|
|
spawn(0)
|
|
O.choose_name(3)
|
|
|
|
boutput(world, text("<b>[O.real_name] is the AI!</b>"))
|
|
dispose()
|
|
|
|
return O
|
|
|
|
/mob/proc/critterize(var/CT)
|
|
if (src.mind || src.client)
|
|
message_admins("[key_name(usr)] made [key_name(src)] a critter ([CT]).")
|
|
logTheThing("admin", usr, src, "made %target% a critter ([CT]).")
|
|
|
|
return make_critter(CT, get_turf(src))
|
|
return 0
|
|
|
|
/mob/proc/make_critter(var/CT, var/turf/T)
|
|
var/mob/living/critter/W = new CT()
|
|
if (!(T && isturf(T)))
|
|
T = get_turf(src)
|
|
|
|
if (!(T && isturf(T)) || (isrestrictedz(T.z) && !(src.client && src.client.holder)))
|
|
var/ASLoc = pick(latejoin)
|
|
if (ASLoc)
|
|
W.set_loc(ASLoc)
|
|
else
|
|
W.set_loc(locate(1, 1, 1))
|
|
else
|
|
W.set_loc(T)
|
|
W.gender = src.gender
|
|
if (src.mind)
|
|
src.mind.transfer_to(W)
|
|
else
|
|
if (src.client)
|
|
var/key = src.client.key
|
|
src.client.mob = W
|
|
W.mind = new /datum/mind()
|
|
ticker.minds += W.mind
|
|
W.mind.key = key
|
|
W.mind.current = W
|
|
spawn(1)
|
|
qdel(src)
|
|
return W
|
|
|
|
|
|
/mob/living/carbon/human/proc/Robotize_MK2(var/gory = 0)
|
|
if (src.transforming) return
|
|
src.unequip_all()
|
|
src.transforming = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
for(var/t in src.organs) qdel(src.organs[text("[t]")])
|
|
|
|
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/(src.loc,null,1)
|
|
|
|
// This is handled in the New() proc of the resulting borg
|
|
//O.cell = new(O)
|
|
//O.cell.maxcharge = 7500
|
|
//if(limit_cell) O.cell.charge = 1500
|
|
//else O.cell.charge = 7500
|
|
|
|
O.gender = src.gender
|
|
O.invisibility = 0
|
|
O.name = "Cyborg"
|
|
O.real_name = "Cyborg"
|
|
if (src.client)
|
|
O.lastKnownIP = src.client.address
|
|
src.client.mob = O
|
|
if (src.ghost)
|
|
if (src.ghost.mind)
|
|
src.ghost.mind.transfer_to(O)
|
|
else
|
|
if(src.mind)
|
|
src.mind.transfer_to(O)
|
|
O.set_loc(src.loc)
|
|
boutput(O, "<B>You are playing as a Cyborg. Cyborgs can interact with most electronic objects in its view point.</B>")
|
|
boutput(O, "<B>You must follow all laws that the AI has.</B>")
|
|
boutput(O, "Use \"say :s (message)\" to speak to fellow cyborgs and the AI through binary.")
|
|
|
|
O.show_laws()
|
|
|
|
O.job = "Cyborg"
|
|
if (O.mind) O.mind.assigned_role = "Cyborg"
|
|
|
|
if(O.mind && (ticker && ticker.mode && istype(ticker.mode, /datum/game_mode/revolution)))
|
|
if ((O.mind in ticker.mode:revolutionaries) || (O.mind in ticker.mode:head_revolutionaries))
|
|
ticker.mode:update_all_rev_icons() //So the icon actually appears
|
|
|
|
if(gory)
|
|
var/mob/living/silicon/robot/R = O
|
|
if (R.cosmetic_mods)
|
|
var/datum/robot_cosmetic/RC = R.cosmetic_mods
|
|
RC.head_mod = "Gibs"
|
|
RC.ches_mod = "Gibs"
|
|
|
|
dispose()
|
|
return O
|
|
/*
|
|
//human -> alien
|
|
/mob/living/carbon/human/proc/Alienize()
|
|
if (src.transforming)
|
|
return
|
|
src.unequip_all()
|
|
src.transforming = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
for(var/t in src.organs)
|
|
qdel(src.organs[t])
|
|
// var/atom/movable/overlay/animation = new /atom/movable/overlay( src.loc )
|
|
// animation.icon_state = "blank"
|
|
// animation.icon = 'icons/mob/mob.dmi'
|
|
// animation.master = src
|
|
// flick("h2alien", animation)
|
|
// sleep(48)
|
|
// qdel(animation)
|
|
var/mob/living/carbon/alien/humanoid/O = new /mob/living/carbon/alien/humanoid( src.loc )
|
|
O.name = "alien"
|
|
O.dna = src.dna
|
|
if(src.mind)
|
|
src.mind.transfer_to(O)
|
|
src.dna = null
|
|
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
|
|
O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
|
|
if (src.client)
|
|
src.client.mob = O
|
|
O.set_loc(src.loc)
|
|
O.a_intent = "harm"
|
|
boutput(O, "<B>You are now an alien.</B>")
|
|
dispose()
|
|
return
|
|
|
|
//human -> alien queen
|
|
/mob/living/carbon/human/proc/Queenize()
|
|
if (src.transforming)
|
|
return
|
|
src.unequip_all()
|
|
src.transforming = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
for(var/t in src.organs)
|
|
qdel(src.organs[t])
|
|
// var/atom/movable/overlay/animation = new /atom/movable/overlay( src.loc )
|
|
// animation.icon_state = "blank"
|
|
// animation.icon = 'icons/mob/mob.dmi'
|
|
// animation.master = src
|
|
// flick("h2alien", animation)
|
|
// sleep(48)
|
|
// qdel(animation)
|
|
var/mob/living/carbon/alien/humanoid/queen/O = new /mob/living/carbon/alien/humanoid/queen( src.loc )
|
|
O.name = "alien queen"
|
|
O.dna = src.dna
|
|
if(src.mind)
|
|
src.mind.transfer_to(O)
|
|
src.dna = null
|
|
O.dna.uni_identity = "00600200A00E0110148FC01300B009"
|
|
O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
|
|
if (src.client)
|
|
src.client.mob = O
|
|
O.set_loc(src.loc)
|
|
O.a_intent = "harm"
|
|
boutput(O, "<B>You are now an alien queen.</B>")
|
|
dispose()
|
|
return
|
|
*/
|
|
//human -> hivebot
|
|
/mob/living/carbon/human/proc/Hiveize(var/mainframe = 0)
|
|
if (src.transforming)
|
|
return
|
|
src.unequip_all()
|
|
src.transforming = 1
|
|
src.canmove = 0
|
|
src.icon = null
|
|
src.invisibility = 101
|
|
for(var/t in src.organs)
|
|
qdel(src.organs[text("[t]")])
|
|
|
|
if(!mainframe)
|
|
var/mob/living/silicon/hivebot/O = new /mob/living/silicon/hivebot( src.loc )
|
|
|
|
O.gender = src.gender
|
|
O.invisibility = 0
|
|
O.name = "Robot"
|
|
O.real_name = "Robot"
|
|
O.lastKnownIP = src.client.address
|
|
if (src.client)
|
|
src.client.mob = O
|
|
if(src.mind)
|
|
src.mind.transfer_to(O)
|
|
O.set_loc(src.loc)
|
|
boutput(O, "<B>You are a Robot.</B>")
|
|
boutput(O, "<B>You're more or less a Cyborg but have no organic parts.</B>")
|
|
boutput(O, "To use something, simply double-click it.")
|
|
boutput(O, "Use say \":s to speak in binary.")
|
|
|
|
dispose()
|
|
return O
|
|
|
|
|
|
else if(mainframe)
|
|
var/mob/living/silicon/hive_mainframe/O = new /mob/living/silicon/hive_mainframe( src.loc )
|
|
|
|
O.gender = src.gender
|
|
O.invisibility = 0
|
|
O.name = "Robot"
|
|
O.real_name = "Robot"
|
|
O.lastKnownIP = src.client.address
|
|
if (src.client)
|
|
src.client.mob = O
|
|
if(src.mind)
|
|
src.mind.transfer_to(O)
|
|
O.Namepick()
|
|
O.set_loc(src.loc)
|
|
boutput(O, "<B>You are a Mainframe Unit.</B>")
|
|
boutput(O, "<B>You cant do much on your own but can take remote command of nearby empty Robots.</B>")
|
|
boutput(O, "Press Deploy to search for nearby bots to command.")
|
|
boutput(O, "Use say \":s to speak in binary.")
|
|
|
|
dispose()
|
|
return O
|
|
|
|
/mob/proc/blobize()
|
|
if (src.mind || src.client)
|
|
message_admins("[key_name(usr)] made [key_name(src)] a blob.")
|
|
logTheThing("admin", usr, src, "made %target% a blob.")
|
|
|
|
return make_blob()
|
|
return 0
|
|
|
|
/mob/proc/machoize()
|
|
if (src.mind || src.client)
|
|
message_admins("[key_name(usr)] made [key_name(src)] a macho man.")
|
|
logTheThing("admin", usr, src, "made %target% a macho man.")
|
|
var/mob/living/carbon/human/machoman/W = new/mob/living/carbon/human/machoman(src)
|
|
|
|
var/turf/T = get_turf(src)
|
|
if (!(T && isturf(T)) || (isrestrictedz(T.z) && !(src.client && src.client.holder)))
|
|
var/ASLoc = pick(latejoin)
|
|
if (ASLoc)
|
|
W.set_loc(ASLoc)
|
|
else
|
|
W.set_loc(locate(1, 1, 1))
|
|
else
|
|
W.set_loc(T)
|
|
|
|
if (src.mind)
|
|
src.mind.transfer_to(W)
|
|
src.mind.special_role = "macho man"
|
|
else
|
|
var/key = src.client.key
|
|
if (src.client)
|
|
src.client.mob = W
|
|
W.mind = new /datum/mind()
|
|
ticker.minds += W.mind
|
|
W.mind.key = key
|
|
W.mind.current = W
|
|
qdel(src)
|
|
|
|
spawn (25) // Don't remove.
|
|
if (W) W.assign_gimmick_skull()
|
|
|
|
boutput(W, "<span style=\"color:blue\">You are now a macho man!</span>")
|
|
|
|
return W
|
|
return 0
|
|
|
|
/mob/proc/cubeize(var/life = 10)
|
|
if (src.mind || src.client)
|
|
message_admins("[key_name(usr)] made [key_name(src)] a meat cube with a lifetime of [life].")
|
|
logTheThing("admin", usr, src, "made %target% a meat cube with a lifetime of [life].")
|
|
|
|
return make_meatcube(life)
|
|
return 0
|
|
|
|
/mob/proc/make_meatcube(var/life = 10, var/turf/T)
|
|
var/mob/living/carbon/wall/meatcube/W = new/mob/living/carbon/wall/meatcube(src)
|
|
if (!T || !isturf(T))
|
|
T = get_turf(src)
|
|
W.life_timer = life
|
|
|
|
if (!(T && isturf(T)) || (isrestrictedz(T.z) && !(src.client && src.client.holder)))
|
|
var/ASLoc = pick(latejoin)
|
|
if (ASLoc)
|
|
W.set_loc(ASLoc)
|
|
else
|
|
W.set_loc(locate(1, 1, 1))
|
|
else
|
|
W.set_loc(T)
|
|
W.gender = src.gender
|
|
W.real_name = src.real_name
|
|
if (src.mind)
|
|
src.mind.transfer_to(W)
|
|
src.mind.assigned_role = "Meatcube"
|
|
else
|
|
if (src.client)
|
|
var/key = src.client.key
|
|
src.client.mob = W
|
|
W.mind = new /datum/mind()
|
|
ticker.minds += W.mind
|
|
W.mind.key = key
|
|
W.mind.current = W
|
|
spawn(1)
|
|
qdel(src)
|
|
return W |