Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into ipcmasterrace

Conflicts:
	code/modules/mob/living/simple_animal/friendly/fox.dm
	code/modules/organs/organ_alien.dm
This commit is contained in:
Markolie
2015-08-18 18:38:59 +02:00
246 changed files with 2655 additions and 2105 deletions
+4 -3
View File
@@ -311,13 +311,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(jobban_isbanned(M, "AntagHUD"))
src << "\red <B>You have been banned from using this feature</B>"
return
if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder)
if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !check_rights(R_MOD,0))
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
if(M in respawnable_list)
respawnable_list -= M
if(!M.has_enabled_antagHUD && !client.holder)
if(!M.has_enabled_antagHUD && !check_rights(R_MOD,0))
M.has_enabled_antagHUD = 1
if(M.antagHUD)
M.antagHUD = 0
@@ -598,4 +598,5 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now
client.images |= ghost_darkness_images
if (ghostimage)
client.images -= ghostimage //remove ourself
client.images -= ghostimage //remove ourself
-6
View File
@@ -115,12 +115,6 @@
if(vname)
speaker_name = vname
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
if(H.voice)
speaker_name = H.voice
if(hard_to_hear)
speaker_name = "unknown"
+3 -3
View File
@@ -452,9 +452,9 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
var/start_T_descriptor = "<font color='#6b5d00'>tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]</font>"
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
msg_admin_attack("[usr.name] ([usr.ckey])[isAntag(usr) ? "(ANTAG)" : ""] has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)")
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [key_name(usr)] from [start_T_descriptor] with the target [end_T_descriptor]</font>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [key_name(M)] from [start_T_descriptor] with the target [end_T_descriptor]</font>")
msg_admin_attack("[key_name_admin(usr)] has thrown [key_name_admin(M)] from [start_T_descriptor] with the target [end_T_descriptor]")
if(!iscarbon(usr))
M.LAssailant = null
@@ -136,7 +136,7 @@
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
if(ticker && ticker.mode)
// world.log << "k"
// log_to_dd("k")
sql_report_death(src)
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
return ..(gibbed)
@@ -841,11 +841,11 @@
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN))
pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN))
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1))
flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
+16 -12
View File
@@ -431,12 +431,10 @@
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
if(!istype(M))
return 0
for(var/L in M.contents)
/mob/living/carbon/human/proc/is_loyalty_implanted()
for(var/L in contents)
if(istype(L, /obj/item/weapon/implant/loyalty))
for(var/obj/item/organ/external/O in M.organs)
for(var/obj/item/organ/external/O in organs)
if(L in O.implants)
return 1
return 0
@@ -696,6 +694,12 @@
// if looting pockets with gloves, do it quietly
if(href_list["pockets"])
if(isanimal(usr))
return //animals cannot strip people
if(frozen)
usr << "\red Do not attempt to strip frozen people."
return
var/pocket_side = href_list["pockets"]
var/pocket_id = (pocket_side == "right" ? slot_r_store : slot_l_store)
var/obj/item/pocket_item = (pocket_id == slot_r_store ? src.r_store : src.l_store)
@@ -722,16 +726,19 @@
// Update strip window
if(usr.machine == src && in_range(src, usr))
show_inv(usr)
else if(!pickpocket)
// Display a warning if the user mocks up
src << "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>"
// if looting id with gloves, do it quietly - this allows pickpocket gloves to take/place id stealthily - Bone White
if(href_list["item"])
if(isanimal(usr))
return //animals cannot strip people
if(frozen)
usr << "\red Do not attempt to strip frozen people."
return
var/itemTarget = href_list["item"]
if(itemTarget == "id")
if(pickpocket)
@@ -764,9 +771,6 @@
// Display a warning if the user mocks up
src << "<span class='warning'>You feel your ID slot being fumbled with!</span>"
if (href_list["refresh"])
if((machine)&&(in_range(src, usr)))
show_inv(machine)
@@ -105,16 +105,19 @@
if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove their mask!"
M << "<span class='warning'>Remove their mask!</span>"
return 0
if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
M << "\red Remove your mask!"
M << "<span class='warning'>Remove your mask!</span>"
return 0
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
M << "<span class='warning'>Your fangs fail to pierce [src.name]'s cold flesh</span>"
return 0
if(SKELETON in mutations)
M << "\red There is no blood in a skeleton!"
M << "<span class='warning'>There is no blood in a skeleton!</span>"
return 0
if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not.
M << "<span class='warning'>Blood from a monkey is useless!</span>"
return 0
//we're good to suck the blood, blaah
M.handle_bloodsucking(src)
@@ -232,9 +232,9 @@ emp_act
--src.meatleft
user << "\red You hack off a chunk of meat from [src.name]"
if(!src.meatleft)
src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by <b>[user]/[user.ckey]</b>"
user.attack_log += "\[[time_stamp()]\] Chopped up <b>[src]/[src.ckey]</b> into meat</b>"
msg_admin_attack("[user.name] ([user.ckey])[isAntag(user) ? "(ANTAG)" : ""] chopped up [src] ([src.ckey]) into meat (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
src.attack_log += "\[[time_stamp()]\] Was chopped up into meat by <b>[key_name(user)]</b>"
user.attack_log += "\[[time_stamp()]\] Chopped up <b>[key_name(src)]</b> into meat</b>"
msg_admin_attack("[key_name_admin(user)] chopped up [key_name_admin(src)] into meat")
if(!iscarbon(user))
LAssailant = null
else
@@ -387,12 +387,11 @@ emp_act
if(ismob(O.thrower))
var/mob/M = O.thrower
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(M)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [key_name(M)]</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [key_name(src)] with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]")
//thrown weapon embedded object code.
if(dtype == BRUTE && istype(O,/obj/item))
@@ -490,8 +489,11 @@ emp_act
M.occupant_message("<span class='danger'>You hit [src].</span>")
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
M.occupant.attack_log += text("\[[time_stamp()]\] <font color='red'>Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
else
..()
@@ -29,8 +29,8 @@
var/age = 30 //Player's age (pure fluff)
var/b_type = "A+" //Player's bloodtype
var/underwear = 1 //Which underwear the player wants
var/undershirt = 0 //Which undershirt the player wants.
var/underwear = "Nude" //Which underwear the player wants
var/undershirt = "Nude" //Which undershirt the player wants.
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
//Equipment slots
+1 -1
View File
@@ -190,7 +190,7 @@
//These only pertain to common. Languages are handled by mob/say_understands()
if (!speaking)
if (istype(other, /mob/living/carbon/primitive/diona))
if (istype(other, /mob/living/simple_animal/diona))
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
return 1
if (istype(other, /mob/living/silicon))
@@ -406,7 +406,7 @@
)
/datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/primitive/diona/D = other
var/mob/living/simple_animal/diona/D = other
if(istype(D))
return 1
return 0
@@ -419,14 +419,14 @@
/* //overpowered and dumb as hell; they get cloning back, though.
/datum/species/diona/handle_death(var/mob/living/carbon/human/H)
var/mob/living/carbon/primitive/diona/S = new(get_turf(H))
var/mob/living/simple_animal/diona/S = new(get_turf(H))
if(H.mind)
H.mind.transfer_to(S)
else
S.key = H.key
for(var/mob/living/carbon/primitive/diona/D in H.contents)
for(var/mob/living/simple_animal/diona/D in H.contents)
if(D.client)
D.loc = H.loc
else
@@ -498,4 +498,4 @@
H.h_style = ""
spawn(100)
if(H) H.update_hair()
@@ -318,10 +318,14 @@ var/global/list/damage_icon_parts = list()
//Underwear
if(underwear && species.flags & HAS_UNDERWEAR)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
if(undershirt && species.flags & HAS_UNDERWEAR)
stand_icon.Blend(new /icon('icons/mob/human.dmi', "undershirt[undershirt]_s"), ICON_OVERLAY)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
if(update_icons)
update_icons()
@@ -1,182 +0,0 @@
/mob/living/carbon/primitive/emote(var/act,var/m_type=1,var/message = null)
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
param = copytext(act, t1 + 1, length(act) + 1)
act = copytext(act, 1, t1)
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = is_muzzled()
//Emote Cooldown System (it's so simple!)
// proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
var/on_CD = 0
switch(act)
//Cooldown-inducing emotes
if("chirp")
if(istype(src,/mob/living/carbon/primitive/diona)) //Only Diona Nymphs can chirp
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else //Everyone else fails, skip the emote attempt
return
if("flip")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
//Everything else, including typos of the above emotes
else
on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
if(on_CD == 1) // Check if we need to suppress the emote attempt.
return // Suppress emote, you're still cooling off.
//--FalseIncarnate
switch(act)
if ("me")
if(silent)
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "\red You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
if(!(message))
return
return custom_emote(m_type, message)
if ("custom")
return custom_emote(m_type, message)
if ("chirp")
message = "<B>The [src.name]</B> chirps!"
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
m_type = 2
if("sign")
if (!src.restrained())
message = text("<B>The [src.name]</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
m_type = 1
if("scratch")
if (!src.restrained())
message = "<B>The [src.name]</B> scratches."
m_type = 1
if("whimper")
if (!muzzled)
message = "<B>The [src.name]</B> whimpers."
m_type = 2
if("roar")
if (!muzzled)
message = "<B>The [src.name]</B> roars."
m_type = 2
if("tail")
message = "<B>The [src.name]</B> waves his tail."
m_type = 1
if("gasp")
message = "<B>The [src.name]</B> gasps."
m_type = 2
if("shiver")
message = "<B>The [src.name]</B> shivers."
m_type = 2
if("drool")
message = "<B>The [src.name]</B> drools."
m_type = 1
if("paw")
if (!src.restrained())
message = "<B>The [src.name]</B> flails his paw."
m_type = 1
if("scretch")
if (!muzzled)
message = "<B>The [src.name]</B> scretches."
m_type = 2
if("choke")
message = "<B>The [src.name]</B> chokes."
m_type = 2
if("moan")
message = "<B>The [src.name]</B> moans!"
m_type = 2
if("nod")
message = "<B>The [src.name]</B> nods his head."
m_type = 1
if("sit")
message = "<B>The [src.name]</B> sits down."
m_type = 1
if("sway")
message = "<B>The [src.name]</B> sways around dizzily."
m_type = 1
if("sulk")
message = "<B>The [src.name]</B> sulks down sadly."
m_type = 1
if("twitch")
message = "<B>The [src.name]</B> twitches violently."
m_type = 1
if("dance")
if (!src.restrained())
message = "<B>The [src.name]</B> dances around happily."
m_type = 1
if("roll")
if (!src.restrained())
message = "<B>The [src.name]</B> rolls."
m_type = 1
if("shake")
message = "<B>The [src.name]</B> shakes his head."
m_type = 1
if("gnarl")
if (!muzzled)
message = "<B>The [src.name]</B> gnarls and shows his teeth.."
m_type = 2
if("jump")
message = "<B>The [src.name]</B> jumps!"
m_type = 1
if("collapse")
Paralyse(2)
message = "<B>[src.name]</B> collapses!"
m_type = 2
if("deathgasp")
message = "<B>The [src.name]</B> lets out a faint chimper as it collapses and stops moving..."
m_type = 1
if ("flip")
m_type = 1
if (!src.restrained())
var/M = null
if (param)
for (var/mob/A in view(1, null))
if (param == A.name)
M = A
break
if (M == src)
M = null
if (M)
if(src.lying || src.weakened)
message = "<B>[src]</B> flops and flails around on the floor."
else
message = "<B>[src]</B> flips in [M]'s general direction."
src.SpinAnimation(5,1)
else
if(src.lying || src.weakened)
message = "<B>[src]</B> flops and flails around on the floor."
else
message = "<B>[src]</B> does a flip!"
src.SpinAnimation(5,1)
if("help")
var/text = "choke, "
if(istype(src,/mob/living/carbon/primitive/diona))
text += "chirp, "
text += "flip, collapse, dance, deathgasp, drool, gasp, shiver, gnarl, jump, paw, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
src << text
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
if(src.client)
log_emote("[name]/[key] : [message]")
if (m_type & 1)
for(var/mob/O in viewers(src, null))
O.show_message(message, m_type)
//Foreach goto(703)
else
for(var/mob/O in hearers(src, null))
O.show_message(message, m_type)
//Foreach goto(746)
return
+9 -7
View File
@@ -115,12 +115,11 @@
if(ismob(O.thrower))
var/mob/M = O.thrower
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
if(M)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [key_name(M)]</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [key_name(src)] with a thrown [O]</font>")
if(!istype(src,/mob/living/simple_animal/mouse))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey])[isAntag(M) ? "(ANTAG)" : ""] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]")
// Begin BS12 momentum-transfer code.
if(O.throw_source && speed >= 15)
@@ -166,13 +165,16 @@
M.occupant_message("<span class='danger'>You hit [src].</span>")
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>", \
"<span class='userdanger'>[src] has been hit by [M.name].</span>")
add_logs(M.occupant, src, "attacked", object=M, addition="(INTENT: [uppertext(M.occupant.a_intent)]) (DAMTYPE: [uppertext(M.damtype)])")
attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been attacked by \the [M] controlled by [key_name(M.occupant)] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
M.occupant.attack_log += text("\[[time_stamp()]\] <font color='red'>Attacked [src] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])</font>")
msg_admin_attack("[key_name_admin(M.occupant)] attacked [key_name_admin(src)] with \the [M] (INTENT: [uppertext(M.occupant.a_intent)])")
else
step_away(src,M)
add_logs(M.occupant, src, "pushed", object=M, admin=0)
M.occupant_message("<span class='warning'>You push [src] out of the way.</span>")
visible_message("<span class='warning'>[M] pushes [src] out of the way.</span>")
return
//Mobs on Fire
+8 -5
View File
@@ -242,6 +242,7 @@ var/list/ai_verbs_default = list(
powered_ai = ai
if(isnull(powered_ai))
qdel(src)
return
loc = powered_ai.loc
use_power(1) // Just incase we need to wake up the power system.
@@ -251,6 +252,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/process()
if(!powered_ai || powered_ai.stat & DEAD)
qdel(src)
return
if(!powered_ai.anchored)
loc = powered_ai.loc
use_power = 0
@@ -329,20 +331,21 @@ var/list/ai_verbs_default = list(
set name = "Call Emergency Shuttle"
set category = "AI Commands"
if(src.stat == 2)
src << "You can't call the shuttle because you are dead!"
if(src.stat == DEAD)
src << "<span class='warning'>You can't call the shuttle because you are dead!</span>"
return
if(check_unable(AI_CHECK_WIRELESS))
return
var/confirm = alert("Are you sure you want to call the shuttle?", "Confirm Shuttle Call", "Yes", "No")
var/input = input(usr, "Please enter the reason for calling the shuttle.", "Shuttle Call Reason.","") as text|null
if(!input || stat)
return
if(check_unable(AI_CHECK_WIRELESS))
return
if(confirm == "Yes")
call_shuttle_proc(src)
call_shuttle_proc(src, input)
// hack to display shuttle timer
if(emergency_shuttle.online())
@@ -369,6 +369,8 @@
/mob/living/silicon/pai/proc/hackloop()
var/turf/T = get_turf_or_move(src.loc)
for(var/mob/living/silicon/ai/AI in player_list)
if(!T || !(T.z in config.contact_levels))
break
if(T.loc)
AI << "<font color = red><b>Network Alert: Brute-force encryption crack in progress in [T.loc].</b></font>"
else
@@ -12,6 +12,7 @@
if(!O)
return 0
O.mouse_opacity = 2
if(istype(O,/obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
@@ -44,6 +45,7 @@
src << "Already activated"
return
if(!module_state_1)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_1 = O
O.layer = 20
O.screen_loc = inv1.screen_loc
@@ -51,6 +53,7 @@
if(istype(module_state_1,/obj/item/borg/sight))
sight_mode |= module_state_1:sight_mode
else if(!module_state_2)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_2 = O
O.layer = 20
O.screen_loc = inv2.screen_loc
@@ -58,6 +61,7 @@
if(istype(module_state_2,/obj/item/borg/sight))
sight_mode |= module_state_2:sight_mode
else if(!module_state_3)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_3 = O
O.layer = 20
O.screen_loc = inv3.screen_loc
@@ -30,6 +30,15 @@
src.modules += new /obj/item/device/flash/cyborg(src)
src.emag = new /obj/item/toy/sword(src)
src.emag.name = "Placeholder Emag Item"
/obj/item/weapon/robot_module/proc/fix_modules()
for(var/obj/item/I in modules)
I.flags |= NODROP
I.mouse_opacity = 2
if(emag)
emag.flags |= NODROP
emag.mouse_opacity = 2
/obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R)
if(!stacktypes || !stacktypes.len) return
@@ -85,15 +94,16 @@
name = "standard robot module"
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
return
/obj/item/weapon/robot_module/standard/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
fix_modules()
/obj/item/weapon/robot_module/medical
name = "medical robot module"
@@ -105,36 +115,37 @@
/obj/item/stack/nanopaste = 5
)
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/weapon/borg_defib(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/reagent_containers/dropper(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src)
src.modules += new /obj/item/stack/medical/advanced/ointment(src)
src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/stack/nanopaste(src)
src.modules += new /obj/item/weapon/scalpel(src)
src.modules += new /obj/item/weapon/hemostat(src)
src.modules += new /obj/item/weapon/retractor(src)
src.modules += new /obj/item/weapon/cautery(src)
src.modules += new /obj/item/weapon/bonegel(src)
src.modules += new /obj/item/weapon/FixOVein(src)
src.modules += new /obj/item/weapon/bonesetter(src)
src.modules += new /obj/item/weapon/circular_saw(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
/obj/item/weapon/robot_module/medical/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
src.modules += new /obj/item/weapon/borg_defib(src)
src.modules += new /obj/item/roller_holder(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/reagent_containers/dropper(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/extinguisher/mini(src)
src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src)
src.modules += new /obj/item/stack/medical/advanced/ointment(src)
src.modules += new /obj/item/stack/medical/splint(src)
src.modules += new /obj/item/stack/nanopaste(src)
src.modules += new /obj/item/weapon/scalpel(src)
src.modules += new /obj/item/weapon/hemostat(src)
src.modules += new /obj/item/weapon/retractor(src)
src.modules += new /obj/item/weapon/cautery(src)
src.modules += new /obj/item/weapon/bonegel(src)
src.modules += new /obj/item/weapon/FixOVein(src)
src.modules += new /obj/item/weapon/bonesetter(src)
src.modules += new /obj/item/weapon/circular_saw(src)
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("facid", 250)
src.emag.name = "Polyacid spray"
return
src.emag.reagents.add_reagent("facid", 250)
src.emag.name = "Polyacid spray"
fix_modules()
/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R)
if(src.emag)
@@ -155,115 +166,113 @@
/obj/item/stack/tile/plasteel = 15
)
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
/obj/item/weapon/robot_module/engineering/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/weldingtool/largetank(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/t_scanner(src)
src.modules += new /obj/item/device/analyzer(src)
src.modules += new /obj/item/taperoll/engineering(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.emag = new /obj/item/borg/stun(src)
src.emag = new /obj/item/borg/stun(src)
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.amount = 50
src.modules += M
var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
M.amount = 50
src.modules += M
var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src)
R.amount = 50
src.modules += R
var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src)
R.amount = 50
src.modules += R
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src)
G.amount = 50
src.modules += G
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src)
G.amount = 50
src.modules += G
var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src)
W.amount = 50
src.modules += W
var/obj/item/stack/cable_coil/cyborg/W = new /obj/item/stack/cable_coil/cyborg(src)
W.amount = 50
src.modules += W
var/obj/item/stack/rods/Q = new /obj/item/stack/rods(src)
Q.amount = 15
src.modules += Q
var/obj/item/stack/rods/Q = new /obj/item/stack/rods(src)
Q.amount = 15
src.modules += Q
var/obj/item/stack/tile/plasteel/F = new /obj/item/stack/tile/plasteel(src) //floor tiles not regular plasteel, calm down
F.amount = 15
src.modules += F
var/obj/item/stack/tile/plasteel/F = new /obj/item/stack/tile/plasteel(src) //floor tiles not regular plasteel, calm down
F.amount = 15
src.modules += F
return
fix_modules()
/obj/item/weapon/robot_module/security
name = "security robot module"
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
return
/obj/item/weapon/robot_module/security/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
src.modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src)
src.emag = new /obj/item/weapon/gun/energy/laser/cyborg(src)
fix_modules()
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
/obj/item/weapon/robot_module/janitor/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
src.modules += new /obj/item/weapon/mop(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/holosign_creator(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
src.modules += new /obj/item/weapon/mop(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/holosign_creator(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
return
src.emag.reagents.add_reagent("lube", 250)
src.emag.name = "Lube spray"
fix_modules()
/obj/item/weapon/robot_module/butler
name = "service robot module"
/obj/item/weapon/robot_module/butler/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
src.modules += new /obj/item/weapon/pen(src)
src.modules += new /obj/item/weapon/razor(src)
src.modules += new /obj/item/device/violin(src)
src.modules += new /obj/item/device/guitar(src)
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
src.modules += new /obj/item/weapon/pen(src)
src.modules += new /obj/item/weapon/razor(src)
src.modules += new /obj/item/device/violin(src)
src.modules += new /obj/item/device/guitar(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
src.modules += M
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
src.modules += M
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
src.modules += new /obj/item/weapon/lighter/zippo(src)
src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/robodropper(src)
src.modules += new /obj/item/weapon/lighter/zippo(src)
src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
var/datum/reagents/R = new/datum/reagents(50)
src.emag.reagents = R
R.my_atom = src.emag
R.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
return
var/datum/reagents/R = new/datum/reagents(50)
src.emag.reagents = R
R.my_atom = src.emag
R.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
fix_modules()
/obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
@@ -307,19 +316,19 @@
/obj/item/weapon/robot_module/miner
name = "miner robot module"
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
src.emag = new /obj/item/borg/stun(src)
return
/obj/item/weapon/robot_module/miner/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
src.emag = new /obj/item/borg/stun(src)
fix_modules()
/obj/item/weapon/robot_module/deathsquad
name = "NT advanced combat module"
@@ -332,7 +341,8 @@
src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
return
fix_modules()
/obj/item/weapon/robot_module/syndicate
name = "syndicate robot module"
@@ -347,38 +357,42 @@
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
return
fix_modules()
/obj/item/weapon/robot_module/combat
name = "combat robot module"
New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/plasmacutter(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair?
src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
return
/obj/item/weapon/robot_module/combat/New()
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/plasmacutter(src)
src.modules += new /obj/item/borg/combat/shield(src)
src.modules += new /obj/item/borg/combat/mobility(src)
src.modules += new /obj/item/weapon/wrench(src) //Is a combat android really going to be stopped by a chair?
src.emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
/obj/item/weapon/robot_module/alien/hunter
name = "alien hunter module"
New()
src.modules += new /obj/item/weapon/melee/energy/alien/claws(src)
src.modules += new /obj/item/device/flash/cyborg/alien(src)
src.modules += new /obj/item/borg/sight/thermal/alien(src)
var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src)
S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop.
src.modules += S
var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src)
S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter.
src.modules += A
src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
src.emag.reagents.add_reagent("facid", 125)
src.emag.reagents.add_reagent("sacid", 125)
/obj/item/weapon/robot_module/alien/hunter/New()
src.modules += new /obj/item/weapon/melee/energy/alien/claws(src)
src.modules += new /obj/item/device/flash/cyborg/alien(src)
src.modules += new /obj/item/borg/sight/thermal/alien(src)
var/obj/item/weapon/reagent_containers/spray/alien/stun/S = new /obj/item/weapon/reagent_containers/spray/alien/stun(src)
S.reagents.add_reagent("ether",250) //nerfed to sleeptoxin to make it less instant drop.
src.modules += S
var/obj/item/weapon/reagent_containers/spray/alien/smoke/A = new /obj/item/weapon/reagent_containers/spray/alien/smoke(src)
S.reagents.add_reagent("water",50) //Water is used as a dummy reagent for the smoke bombs. More of an ammo counter.
src.modules += A
src.emag = new /obj/item/weapon/reagent_containers/spray/alien/acid(src)
src.emag.reagents.add_reagent("facid", 125)
src.emag.reagents.add_reagent("sacid", 125)
fix_modules()
/obj/item/weapon/robot_module/alien/hunter/add_languages(var/mob/living/silicon/robot/R)
..()
@@ -398,27 +412,27 @@
/obj/item/stack/cable_coil/cyborg = 30
)
New()
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
src.modules += new /obj/item/weapon/soap(src)
/obj/item/weapon/robot_module/drone/New()
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/wirecutters(src)
src.modules += new /obj/item/device/multitool(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/gripper(src)
src.modules += new /obj/item/weapon/matter_decompiler(src)
src.modules += new /obj/item/weapon/reagent_containers/spray/cleaner/drone(src)
src.modules += new /obj/item/weapon/soap(src)
src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
src.emag = new /obj/item/weapon/pickaxe/drill/cyborg/diamond(src)
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
src.modules += W
for(var/T in stacktypes)
var/obj/item/stack/sheet/W = new T(src)
W.amount = stacktypes[T]
src.modules += W
return
fix_modules()
/obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R)
var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules
@@ -21,7 +21,7 @@
BorgIndexToWireColor[flagIndex] = colorIndex
BorgWireColorToIndex[colorIndex] = flagIndex
colorIndexList -= colorIndex // Shortens the list.
//world.log << "Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]"
//log_to_dd("Flag: [flag], CIndex: [colorIndex], FIndex: [flagIndex]")
flagIndex+=1
return Borgwires
+1 -1
View File
@@ -241,7 +241,7 @@
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = sanitize(copytext(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text, 1))
flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
/mob/living/silicon/binarycheck()
return 1
@@ -196,8 +196,8 @@
src << "\red <B>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</B>"
host << "\red <B>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</B>"
var/borer_key = src.key
host.attack_log += text("\[[time_stamp()]\] <font color='blue'>[src.name] ([src.ckey]) has assumed control of [host.name] ([host.ckey])</font>")
msg_admin_attack("[src.name] ([src.ckey]) has assumed control of [host.name] ([host.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[host.x];Y=[host.y];Z=[host.z]'>JMP</a>)")
host.attack_log += text("\[[time_stamp()]\] <font color='blue'>[key_name(src)] has assumed control of [key_name(host)]</font>")
msg_admin_attack("[key_name_admin(src)] has assumed control of [key_name_admin(host)]")
// host -> brain
var/h2b_id = host.computer_id
var/h2b_ip= host.lastKnownIP
@@ -25,6 +25,7 @@
minbodytemp = 0
faction = list("cult")
flying = 1
universal_speak = 1
var/list/construct_spells = list()
/mob/living/simple_animal/construct/New()
@@ -5,6 +5,7 @@
icon_state = "cat2"
icon_living = "cat2"
icon_dead = "cat2_dead"
icon_resting = "cat_rest"
gender = MALE
speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
@@ -76,6 +77,7 @@
icon_state = "kitten"
icon_living = "kitten"
icon_dead = "kitten_dead"
icon_resting = null
gender = NEUTER
density = 0
pass_flags = PASSMOB
@@ -86,6 +88,7 @@
icon_state = "Syndicat"
icon_living = "Syndicat"
icon_dead = "Syndicat_dead"
icon_resting = "Syndicat_rest"
gender = FEMALE
flags = NO_BREATHE
faction = list("syndicate")
@@ -3,57 +3,73 @@
*/
//Mob defines.
/mob/living/carbon/primitive/diona
/mob/living/simple_animal/diona
name = "diona nymph"
voice_name = "diona nymph"
speak_emote = list("chirrups")
icon = 'icons/mob/monkey.dmi'
icon_state = "nymph1"
icon_state = "nymph"
icon_living = "nymph"
icon_dead = "nymph_dead"
icon_resting = "nymph_sleep"
pass_flags = PASSTABLE
small = 1
ventcrawler = 2
maxHealth = 50
health = 50
voice_name = "diona nymph"
speak_emote = list("chirrups")
emote_hear = list("chirrups")
emote_see = list("chirrups")
response_help = "pets"
response_disarm = "pushes"
response_harm = "kicks"
melee_damage_lower = 5
melee_damage_upper = 8
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speed = 0
stop_automated_movement = 0
turns_per_move = 4
status_flags = 0
var/list/donors = list()
var/ready_evolve = 0
ventcrawler = 1
var/environment_smash = 0 // This is a sloppy way to solve attack_animal runtimes. Stupid nymphs...
holder_type = /obj/item/weapon/holder/diona
/mob/living/carbon/primitive/diona/New()
/mob/living/simple_animal/diona/New()
..()
gender = NEUTER
//greaterform = "Diona"
if(name == initial(name)) //To stop Pun-Pun becoming generic.
name = "[name] ([rand(1, 1000)])"
real_name = name
add_language("Rootspeak")
src.verbs += /mob/living/simple_animal/diona/proc/merge
/mob/living/carbon/primitive/diona/attack_hand(mob/living/carbon/human/M as mob)
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M as mob)
//Let people pick the little buggers up.
if(M.a_intent == "help")
if(M.species && M.species.name == "Diona")
M << "You feel your being twine with that of [src] as it merges with your biomass."
src << "You feel your being twine with that of [M] as you merge with its biomass."
src.verbs += /mob/living/carbon/primitive/diona/proc/split
src.verbs -= /mob/living/carbon/primitive/diona/proc/merge
src.verbs += /mob/living/simple_animal/diona/proc/split
src.verbs -= /mob/living/simple_animal/diona/proc/merge
src.forceMove(M)
else
get_scooped(M)
..()
/mob/living/carbon/primitive/diona/New()
..()
gender = NEUTER
//greaterform = "Diona"
add_language("Rootspeak")
src.verbs += /mob/living/carbon/primitive/diona/proc/merge
/mob/living/carbon/primitive/diona/proc/merge()
/mob/living/simple_animal/diona/proc/merge()
set category = "Diona"
set name = "Merge with gestalt"
set desc = "Merge with another diona."
if(istype(src.loc,/mob/living/carbon))
src.verbs -= /mob/living/carbon/primitive/diona/proc/merge
src.verbs -= /mob/living/simple_animal/diona/proc/merge
return
var/list/choices = list()
@@ -76,19 +92,18 @@
src << "You feel your being twine with that of [M] as you merge with its biomass."
src.loc = M
src.verbs += /mob/living/carbon/primitive/diona/proc/split
src.verbs -= /mob/living/carbon/primitive/diona/proc/merge
src.verbs += /mob/living/simple_animal/diona/proc/split
src.verbs -= /mob/living/simple_animal/diona/proc/merge
else
return
/mob/living/carbon/primitive/diona/proc/split()
/mob/living/simple_animal/diona/proc/split()
set category = "Diona"
set name = "Split from gestalt"
set desc = "Split away from your gestalt as a lone nymph."
if(!(istype(src.loc,/mob/living/carbon)))
src.verbs -= /mob/living/carbon/primitive/diona/proc/split
src.verbs -= /mob/living/simple_animal/diona/proc/split
return
src.loc << "You feel a pang of loss as [src] splits away from your biomass."
@@ -97,8 +112,8 @@
var/mob/living/M = src.loc
src.loc = get_turf(src)
src.verbs -= /mob/living/carbon/primitive/diona/proc/split
src.verbs += /mob/living/carbon/primitive/diona/proc/merge
src.verbs -= /mob/living/simple_animal/diona/proc/split
src.verbs += /mob/living/simple_animal/diona/proc/merge
if(istype(M))
for(var/atom/A in M.contents)
@@ -106,8 +121,7 @@
return
M.status_flags &= ~PASSEMOTES
/mob/living/carbon/primitive/diona/verb/fertilize_plant()
/mob/living/simple_animal/diona/verb/fertilize_plant()
set category = "Diona"
set name = "Fertilize plant"
set desc = "Turn your food into nutrients for plants."
@@ -123,10 +137,9 @@
src.nutrition -= ((10-target.nutrilevel)*5)
target.nutrilevel = 10
src.visible_message("\red [src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.")
/mob/living/carbon/primitive/diona/verb/eat_weeds()
src.visible_message("<span class='danger'>[src] secretes a trickle of green liquid from its tail, refilling [target]'s nutrient tray.","\red You secrete a trickle of green liquid from your tail, refilling [target]'s nutrient tray.</span>")
/mob/living/simple_animal/diona/verb/eat_weeds()
set category = "Diona"
set name = "Eat Weeds"
set desc = "Clean the weeds out of soil or a hydroponics tray."
@@ -142,24 +155,23 @@
src.nutrition += target.weedlevel * 15
target.weedlevel = 0
src.visible_message("\red [src] begins rooting through [target], ripping out weeds and eating them noisily.","\red You begin rooting through [target], ripping out weeds and eating them noisily.")
/mob/living/carbon/primitive/diona/verb/evolve()
src.visible_message("<span class='danger'>[src] begins rooting through [target], ripping out weeds and eating them noisily.</span>","<span class='danger'>You begin rooting through [target], ripping out weeds and eating them noisily.</span>")
/mob/living/simple_animal/diona/verb/evolve()
set category = "Diona"
set name = "Evolve"
set desc = "Grow to a more complex form."
if(donors.len < 5)
src << "You need more blood in order to ascend to a new state of consciousness..."
src << "<span class='warning'>You need more blood in order to ascend to a new state of consciousness...</span>"
return
if(nutrition < 500)
src << "You need to binge on weeds in order to have the energy to grow..."
src << "<span class='warning'>You need to binge on weeds in order to have the energy to grow...</span>"
return
src.split()
src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","\red You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
src.visible_message("<span class='danger'>[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.</span>","<span class='danger'>You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.</span>")
var/mob/living/carbon/human/diona/adult = new(get_turf(src.loc))
adult.set_species("Diona")
@@ -184,7 +196,7 @@
qdel(src)
/mob/living/carbon/primitive/diona/verb/steal_blood()
/mob/living/simple_animal/diona/verb/steal_blood()
set category = "Diona"
set name = "Steal Blood"
set desc = "Take a blood sample from a suitable donor."
@@ -198,14 +210,14 @@
if(!M || !src) return
if(M.species.flags & NO_BLOOD)
src << "\red That donor has no blood to take."
src << "<span class='warning'>That donor has no blood to take.</span>"
return
if(donors.Find(M.real_name))
src << "\red That donor offers you nothing new."
src << "<span class='warning'>That donor offers you nothing new.</span>"
return
src.visible_message("\red [src] flicks out a feeler and neatly steals a sample of [M]'s blood.","\red You flick out a feeler and neatly steal a sample of [M]'s blood.")
src.visible_message("<span class='danger'>[src] flicks out a feeler and neatly steals a sample of [M]'s blood.</span>","<span class='danger'>You flick out a feeler and neatly steal a sample of [M]'s blood.</span>")
donors += M.real_name
for(var/datum/language/L in M.languages)
if(!(L.flags & HIVEMIND))
@@ -214,36 +226,37 @@
spawn(25)
update_progression()
/mob/living/carbon/primitive/diona/proc/update_progression()
/mob/living/simple_animal/diona/proc/update_progression()
if(!donors.len)
return
if(donors.len == 5)
ready_evolve = 1
src << "\green You feel ready to move on to your next stage of growth."
src << "<span class='noticealien'>You feel ready to move on to your next stage of growth.</span>"
else if(donors.len == 3)
universal_understand = 1
src << "\green You feel your awareness expand, and realize you know how to understand the creatures around you."
src << "<span class='noticealien'>You feel your awareness expand, and realize you know how to understand the creatures around you.</span>"
else
src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind."
src << "<span class='noticealien'>The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind.</span>"
/mob/living/carbon/primitive/diona/put_in_hands(obj/item/W)
/mob/living/simple_animal/diona/put_in_hands(obj/item/W)
W.loc = get_turf(src)
W.layer = initial(W.layer)
W.dropped()
/mob/living/carbon/primitive/diona/put_in_active_hand(obj/item/W)
src << "\red You don't have any hands!"
/mob/living/simple_animal/diona/put_in_active_hand(obj/item/W)
src << "<span class='warning'>You don't have any hands!</span>"
return
/mob/living/carbon/primitive/diona/say(var/message)
/mob/living/simple_animal/diona/say(var/message)
if(client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
var/verb
message = trim_strip_html_properly(message)
if(stat)
@@ -257,5 +270,22 @@
if(copytext(message,1,2) == "*")
return emote(copytext(message,2))
//parse the language code and consume it
var/datum/language/speaking = parse_language(message)
if(speaking)
message = copytext(message,2+length(speaking.key))
else
speaking = get_default_language()
..(message)
var/ending = copytext(message, length(message))
if (speaking)
// This is broadcast to all mobs with the language,
// irrespective of distance or anything else.
if(speaking.flags & HIVEMIND)
speaking.broadcast(src,trim(message))
return
//If we've gotten this far, keep going!
verb = speaking.get_spoken_verb(ending)
..(message,speaking,verb)
@@ -30,5 +30,6 @@
icon_state = "Syndifox"
icon_living = "Syndifox"
icon_dead = "Syndifox_dead"
icon_resting = "Syndifox_rest"
flags = NO_BREATHE
faction = list("syndicate")
@@ -8,6 +8,7 @@
var/icon_living = ""
var/icon_dead = ""
var/icon_resting = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
var/oxygen_alert = 0
@@ -86,6 +87,10 @@
return
/mob/living/simple_animal/Life()
if(paralysis || stunned || weakened || buckled || resting)
canmove = 0
else
canmove = 1
//Health
if(stat == DEAD)
@@ -97,12 +102,16 @@
density = 1
return 0
if(health < 1)
Die()
if(health > maxHealth)
health = maxHealth
if(resting && icon_resting && stat != DEAD)
icon_state = icon_resting
else if(icon_resting && stat != DEAD)
icon_state = icon_living
if(sleeping)
sleeping = max(sleeping-1, 0)
@@ -548,7 +557,7 @@
gib()
return
/mob/living/simple_animal/say(var/message)
/mob/living/simple_animal/say(var/message,var/datum/language/speaking,var/verb)
if(stat)
return
@@ -558,11 +567,11 @@
if(stat)
return
var/verb = "says"
verb = "says"
if(speak_emote.len)
verb = pick(speak_emote)
message = capitalize(trim_left(message))
..(message, null, verb)
..(message, speaking, verb)
+3 -24
View File
@@ -45,6 +45,9 @@
client.perspective = MOB_PERSPECTIVE
if(ckey in deadmins)
verbs += /client/proc/readmin
//Clear ability list and update from mob.
client.verbs -= ability_verbs
@@ -57,27 +60,3 @@
client.verbs |= H.species.abilities
CallHook("Login", list("client" = src.client, "mob" = src))
//Update morgues on login/logout
if (stat == DEAD)
var/obj/structure/morgue/Morgue = null
var/mob/living/carbon/human/C = null
if (istype(src,/mob/dead/observer)) //We're a ghost, let's find our corpse
var/mob/dead/observer/G = src
if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control.
return
if (G.can_reenter_corpse && G.mind.current)
C = G.mind.current
else if (istype(src,/mob/living/carbon/human))
C = src
if (C) //We found our corpse, is it inside a morgue?
if (istype(C.loc,/obj/structure/morgue))
Morgue = C.loc
else if (istype(C.loc,/obj/structure/closet/body_bag))
var/obj/structure/closet/body_bag/B = C.loc
if (istype(B.loc,/obj/structure/morgue))
Morgue = B.loc
if (Morgue)
Morgue.update()
+3 -24
View File
@@ -10,28 +10,7 @@
if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell.
send2adminirc("[key_name(src)] logged out - no more admins online.")
..()
//Update morgues on login/logout
if (stat == DEAD)
var/obj/structure/morgue/Morgue = null
var/mob/living/carbon/human/C = null
if (istype(src,/mob/dead/observer)) //We're a ghost, let's find our corpse
var/mob/dead/observer/G = src
if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control.
return 1
if (G.can_reenter_corpse && G.mind.current)
C = G.mind.current
else if (istype(src,/mob/living/carbon/human))
C = src
if (C) //We found our corpse, is it inside a morgue?
if (istype(C.loc,/obj/structure/morgue))
Morgue = C.loc
else if (istype(C.loc,/obj/structure/closet/body_bag))
var/obj/structure/closet/body_bag/B = C.loc
if (istype(B.loc,/obj/structure/morgue))
Morgue = B.loc
if (Morgue)
Morgue.update()
CallHook("Logout", list("client" = src.client, "mob" = src))
return 1
+1 -1
View File
@@ -605,7 +605,7 @@ var/list/slot_equipment_priority = list( \
if(lentext(msg) <= 40)
return "\blue [msg]"
else
return "\blue [copytext(msg, 1, 37)]... <a href='byond://?src=\ref[src];flavor_more=1'>More...</a>"
return "\blue [copytext_preserve_html(msg, 1, 37)]... <a href='byond://?src=\ref[src];flavor_more=1'>More...</a>"
/mob/proc/is_dead()
return stat == DEAD
+1 -1
View File
@@ -406,7 +406,7 @@
if(isalien(attacker) && iscarbon(prey)) //Xenomorphs eating carbon mobs
return 1
if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/carbon/primitive/diona)) //Kidan eating nymphs
if(ishuman(attacker) && attacker.get_species() == "Kidan" && istype(prey,/mob/living/simple_animal/diona)) //Kidan eating nymphs
return 1
if(ishuman(attacker) && attacker.get_species() == "Tajaran" && istype(prey,/mob/living/simple_animal/mouse)) //Tajaran eating mice. Meow!
+2 -2
View File
@@ -480,7 +480,7 @@ var/list/intents = list("help","disarm","grab","harm")
name = realname
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && (M.client.holder.rights & R_MOD))) && (M.client.prefs.toggles & CHAT_DEAD))
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || check_rights(R_MOD,0)) && (M.client.prefs.toggles & CHAT_DEAD))
var/follow
var/lname
if(subject)
@@ -491,7 +491,7 @@ var/list/intents = list("help","disarm","grab","harm")
var/mob/dead/observer/DM
if(istype(subject, /mob/dead/observer))
DM = subject
if(M.client.holder) // What admins see
if(check_rights(R_MOD,0)) // What admins see
lname = "[keyname][(DM && DM.anonsay) ? "*" : (DM ? "" : "^")] ([name])"
else
if(DM && DM.anonsay) // If the person is actually observer they have the option to be anonymous
+2
View File
@@ -30,6 +30,8 @@
CallHook("Login", list("client" = src.client, "mob" = src))
new_player_panel()
if(ckey in deadmins)
verbs += /client/proc/readmin
spawn(40)
if(client)
handle_privacy_poll()
+5 -7
View File
@@ -43,7 +43,7 @@
var/isadmin = 0
if(src.client && src.client.holder)
isadmin = 1
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM erro_poll_vote WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM erro_poll_textreply WHERE ckey = \"[ckey]\")")
var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM [format_table_name("poll_vote")] WHERE ckey = \"[ckey]\") AND id NOT IN (SELECT pollid FROM [format_table_name("poll_textreply")] WHERE ckey = \"[ckey]\")")
query.Execute()
var/newpoll = 0
while(query.NextRow())
@@ -178,7 +178,7 @@
var/voted = 0
//First check if the person has not voted yet.
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("privacy")] WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
@@ -203,7 +203,7 @@
return
if(!voted)
var/sql = "INSERT INTO erro_privacy VALUES (null, Now(), '[src.ckey]', '[option]')"
var/sql = "INSERT INTO [format_table_name("privacy")] VALUES (null, Now(), '[src.ckey]', '[option]')"
var/DBQuery/query_insert = dbcon.NewQuery(sql)
query_insert.Execute()
usr << "<b>Thank you for your vote!</b>"
@@ -468,11 +468,9 @@
if(is_alien_whitelisted(src, client.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED))
new_character.add_language(client.prefs.language)
if(ticker.random_players || appearance_isbanned(new_character))
new_character.gender = pick(MALE, FEMALE)
client.prefs.random_character()
client.prefs.real_name = random_name(new_character.gender)
client.prefs.randomize_appearance_for(new_character)
else
client.prefs.copy_to(new_character)
client.prefs.copy_to(new_character)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
+21 -21
View File
@@ -5,7 +5,7 @@
return
var/voted = 0
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM erro_privacy WHERE ckey='[src.ckey]'")
var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("privacy")] WHERE ckey='[src.ckey]'")
query.Execute()
while(query.NextRow())
voted = 1
@@ -53,7 +53,7 @@
if(src.client && src.client.holder)
isadmin = 1
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM erro_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT id, question FROM [format_table_name("poll_question")] WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/output = "<div align='center'><B>Player polls</B>"
@@ -84,7 +84,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid]")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
select_query.Execute()
var/pollstarttime = ""
@@ -109,7 +109,7 @@
switch(polltype)
//Polls that have enumerated options
if("OPTION")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/voted = 0
@@ -121,7 +121,7 @@
var/list/datum/polloption/options = list()
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
options_query.Execute()
while(options_query.NextRow())
var/datum/polloption/PO = new()
@@ -162,7 +162,7 @@
//Polls with a text input
if("TEXT")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/voted = 0
@@ -204,7 +204,7 @@
//Polls with a text input
if("NUMVAL")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM erro_poll_option o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
voted_query.Execute()
var/output = "<div align='center'><B>Player poll</B>"
@@ -230,7 +230,7 @@
var/minid = 999999
var/maxid = 0
var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/option_query = dbcon.NewQuery("SELECT id, text, minval, maxval, descmin, descmid, descmax FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
option_query.Execute()
while(option_query.NextRow())
var/optionid = text2num(option_query.item[1])
@@ -273,7 +273,7 @@
src << browse(output,"window=playerpoll;size=500x500")
if("MULTICHOICE")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
var/list/votedfor = list()
@@ -286,7 +286,7 @@
var/maxoptionid = 0
var/minoptionid = 0
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM erro_poll_option WHERE pollid = [pollid]")
var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
options_query.Execute()
while(options_query.NextRow())
var/datum/polloption/PO = new()
@@ -345,7 +345,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -363,7 +363,7 @@
usr << "\red Poll is not valid."
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]")
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]")
select_query2.Execute()
var/validoption = 0
@@ -378,7 +378,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -399,7 +399,7 @@
adminrank = usr.client.holder.rank
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')")
insert_query.Execute()
usr << "\blue Vote successful."
@@ -415,7 +415,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -432,7 +432,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_textreply WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -457,7 +457,7 @@
usr << "The text you entered was blank, contained illegal characters or was too long. Please correct the text and submit again."
return
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_textreply")] (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')")
insert_query.Execute()
usr << "\blue Feedback logging successful."
@@ -473,7 +473,7 @@
establish_db_connection()
if(dbcon.IsConnected())
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM erro_poll_question WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype FROM [format_table_name("poll_question")] WHERE id = [pollid] AND Now() BETWEEN starttime AND endtime")
select_query.Execute()
var/validpoll = 0
@@ -488,7 +488,7 @@
usr << "\red Poll is not valid."
return
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]")
var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE id = [optionid] AND pollid = [pollid]")
select_query2.Execute()
var/validoption = 0
@@ -503,7 +503,7 @@
var/alreadyvoted = 0
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM erro_poll_vote WHERE optionid = [optionid] AND ckey = '[usr.ckey]'")
var/DBQuery/voted_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
while(voted_query.NextRow())
@@ -519,7 +519,7 @@
adminrank = usr.client.holder.rank
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])")
insert_query.Execute()
usr << "\blue Vote successful."
@@ -1,11 +1,12 @@
datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
if(H)
if(H.gender == MALE)
gender = MALE
else
gender = FEMALE
proc/random_character(gender_override)
if(gender_override)
gender = gender_override
else
gender = pick(MALE, FEMALE)
underwear = random_underwear(gender)
undershirt = random_undershirt(gender)
if(species == "Human")
s_tone = random_skin_tone()
h_style = random_hair_style(gender, species)
@@ -16,12 +17,8 @@ datum/preferences
randomize_eyes_color()
if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
randomize_skin_color()
underwear = rand(1,underwear_m.len)
undershirt = rand(1,undershirt_t.len)
backbag = 2
age = rand(AGE_MIN,AGE_MAX)
if(H)
copy_to(H,1)
proc/randomize_hair_color(var/target = "hair")
@@ -256,12 +253,16 @@ datum/preferences
var/icon/underwear_s = null
if(underwear > 0 && underwear < 7 && current_species.flags & HAS_UNDERWEAR)
underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s")
if(underwear && current_species.flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
underwear_s = new/icon(U.icon, "[U.icon_state]_s", ICON_OVERLAY)
var/icon/undershirt_s = null
if(undershirt > 0 && undershirt < 45 && current_species.flags & HAS_UNDERWEAR)
undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s")
if(undershirt && current_species.flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY)
var/icon/clothes_s = null
var/uniform_dmi='icons/mob/uniform.dmi'
@@ -17,16 +17,29 @@
conversion in savefile.dm
*/
/proc/init_sprite_accessory_subtypes(var/prototype, var/list/L, var/list/male, var/list/female)
if(!istype(L)) L = list()
if(!istype(male)) male = list()
if(!istype(female)) female = list()
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
L[D.name] = D
switch(D.gender)
if(MALE) male += D.name
if(FEMALE) female += D.name
else
male += D.name
female += D.name
return L
/datum/sprite_accessory
var/icon // the icon file the accessory is located in
var/icon_state // the icon_state of the accessory
var/preview_state // a custom preview state for whatever reason
var/name // the preview name of the accessory
// Determines if the accessory will be skipped or included in random hair generations
var/gender = NEUTER
var/icon //the icon file the accessory is located in
var/icon_state //the icon_state of the accessory
var/name //the preview name of the accessory
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
// Restrict some styles to specific species
var/list/species_allowed = list("Human")
@@ -935,3 +948,316 @@
icon_state = "default"
icon = 'icons/mob/human_races/r_skrell.dmi'
species_allowed = list("Skrell")
///////////////////////////
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington")
nude
name = "Nude"
icon_state = null
gender = NEUTER
male_white
name = "Mens White"
icon_state = "male_white"
gender = MALE
male_grey
name = "Mens Grey"
icon_state = "male_grey"
gender = MALE
male_green
name = "Mens Green"
icon_state = "male_green"
gender = MALE
male_blue
name = "Mens Blue"
icon_state = "male_blue"
gender = MALE
male_black
name = "Mens Black"
icon_state = "male_black"
gender = MALE
male_mankini
name = "Mankini"
icon_state = "male_mankini"
gender = MALE
female_red
name = "Ladies Red"
icon_state = "female_red"
gender = FEMALE
female_white
name = "Ladies White"
icon_state = "female_white"
gender = FEMALE
female_yellow
name = "Ladies Yellow"
icon_state = "female_yellow"
gender = FEMALE
female_blue
name = "Ladies Blue"
icon_state = "female_blue"
gender = FEMALE
female_black
name = "Ladies Black"
icon_state = "female_black"
gender = FEMALE
female_kinky
name = "Ladies Kinky"
icon_state = "female_kinky"
gender = FEMALE
////////////////////////////
// Undershirt Definitions //
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
species_allowed = list("Human","Unathi","Vox","Diona","Kidan","Grey","Plasmaman","Skellington")
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
gender = NEUTER
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
name = "White Shirt"
icon_state = "shirt_white"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_black
name = "Black Shirt"
icon_state = "shirt_black"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_grey
name = "Grey Shirt"
icon_state = "shirt_grey"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_red
name = "Red Shirt"
icon_state = "shirt_red"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blue
name = "Blue Shirt"
icon_state = "shirt_blue"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_yellow
name = "Yellow Shirt"
icon_state = "shirt_yellow"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_green
name = "Green Shirt"
icon_state = "shirt_green"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkblue
name = "Dark Blue Shirt"
icon_state = "shirt_darkblue"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkred
name = "Dark Red Shirt"
icon_state = "shirt_darkred"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkgreen
name = "Dark Green Shirt"
icon_state = "shirt_darkgreen"
gender = NEUTER
//end plain color shirts
/datum/sprite_accessory/undershirt/shirt_heart
name = "Heart Shirt"
icon_state = "shirt_heart"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_corgi
name = "Corgi Shirt"
icon_state = "shirt_corgi"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_jack
name = "Union Jack Shirt"
icon_state = "shirt_jack"
gender = NEUTER
/datum/sprite_accessory/undershirt/love_nt
name = "I Love NT Shirt"
icon_state = "shirt_lovent"
gender = NEUTER
/datum/sprite_accessory/undershirt/peace
name = "Peace Shirt"
icon_state = "shirt_peace"
gender = NEUTER
/datum/sprite_accessory/undershirt/mondmondjaja
name = "Band Shirt"
icon_state = "shirt_band"
gender = NEUTER
/datum/sprite_accessory/undershirt/pacman
name = "Pogoman Shirt"
icon_state = "shirt_pogoman"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_ss13
name = "SS13 Shirt"
icon_state = "shirt_ss13"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_question
name = "Question Mark Shirt"
icon_state = "shirt_question"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_skull
name = "Skull Shirt"
icon_state = "shirt_skull"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_commie
name = "Communist Shirt"
icon_state = "shirt_commie"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_nano
name = "Nanotrasen Shirt"
icon_state = "shirt_nano"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_meat
name = "Meat Shirt"
icon_state = "shirt_meat"
gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_tiedie
name = "Tiedie Shirt"
icon_state = "shirt_tiedie"
gender = NEUTER
/datum/sprite_accessory/undershirt/blue_striped
name = "Striped Blue Shirt"
icon_state = "shirt_bluestripe"
gender = NEUTER
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
gender = NEUTER
//short sleeved
/datum/sprite_accessory/undershirt/short_white
name = "White Short-sleeved Shirt"
icon_state = "short_white"
gender = NEUTER
/datum/sprite_accessory/undershirt/short_purple
name = "Purple Short-sleeved Shirt"
icon_state = "short_purple"
gender = NEUTER
/datum/sprite_accessory/undershirt/short_blue
name = "Blue Short-sleeved Shirt"
icon_state = "short_blue"
gender = NEUTER
/datum/sprite_accessory/undershirt/short_green
name = "Green Short-sleeved Shirt"
icon_state = "short_green"
gender = NEUTER
/datum/sprite_accessory/undershirt/short_black
name = "Black Short-sleeved Shirt"
icon_state = "short_black"
gender = NEUTER
//end short sleeved
//polo shirts
/datum/sprite_accessory/undershirt/polo_blue
name = "Blue Polo Shirt"
icon_state = "polo_blue"
gender = NEUTER
/datum/sprite_accessory/undershirt/polo_red
name = "Red Polo Shirt"
icon_state = "polo_red"
gender = NEUTER
/datum/sprite_accessory/undershirt/polo_greyelllow
name = "Grey-Yellow Polo Shirt"
icon_state = "polo_greyellow"
gender = NEUTER
//end polo shirts
//sport shirts
/datum/sprite_accessory/undershirt/sport_green
name = "Green Sports Shirt"
icon_state = "sport_green"
gender = NEUTER
/datum/sprite_accessory/undershirt/sport_red
name = "Red Sports Shirt"
icon_state = "sport_red"
gender = NEUTER
/datum/sprite_accessory/undershirt/sport_blue
name = "Blue Sports Shirt"
icon_state = "sport_blue"
gender = NEUTER
//end sport shirts
/datum/sprite_accessory/undershirt/jersey_red
name = "Red Jersey"
icon_state = "jersey_red"
gender = NEUTER
/datum/sprite_accessory/undershirt/jersey_blue
name = "Blue Jersey"
icon_state = "jersey_blue"
gender = NEUTER
//tanktops
/datum/sprite_accessory/undershirt/tank_white
name = "White Tank-Top"
icon_state = "tank_white"
gender = NEUTER
/datum/sprite_accessory/undershirt/tank_black
name = "Black Tank-Top"
icon_state = "tank_black"
gender = NEUTER
/datum/sprite_accessory/undershirt/tank_grey
name = "Grey Tank-Top"
icon_state = "tank_grey"
gender = NEUTER
/datum/sprite_accessory/undershirt/tank_fire
name = "Fire Tank-Top"
icon_state = "tank_fire"
gender = NEUTER
//end tanktops
+4 -3
View File
@@ -121,8 +121,9 @@
O.add_ai_verbs()
O.rename_self("ai",1)
. = O
qdel(src)
spawn
qdel(src)
return O
/mob/living/carbon/human/make_into_mask(var/should_gib = 0)
for(var/t in organs)
@@ -481,7 +482,7 @@
return 1
//Friendly Creatures!
if(ispath(MP, /mob/living/carbon/primitive/diona) && !jobban_isbanned(src, "Dionaea"))
if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, "Dionaea"))
return 1
//Not in here? Must be untested!