diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 4e6287a5d25..885de82c44b 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -315,6 +315,7 @@ proc/tg_list2text(list/list, glue=",")
if(rights & R_SOUNDS) . += "[seperator]+SOUND"
if(rights & R_SPAWN) . += "[seperator]+SPAWN"
if(rights & R_MOD) . += "[seperator]+MODERATOR"
+ if(rights & R_MENTOR) . += "[seperator]+MENTOR"
return .
/proc/ui_style2icon(ui_style)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 71d6e9025c2..05f7ab63a71 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -60,6 +60,7 @@
var/respawn = 1
var/guest_jobban = 1
var/usewhitelist = 0
+ var/mods_are_mentors = 0
var/kick_inactive = 0 //force disconnect for inactive players
var/load_jobs_from_txt = 0
var/ToRban = 0
@@ -252,6 +253,9 @@
if ("log_runtime")
config.log_runtime = 1
+ if ("mentors")
+ config.mods_are_mentors = 1
+
if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 1978df1ae44..8a3b7d075ea 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -215,6 +215,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
+ var/list/absorbed_species = list()
+ var/list/absorbed_languages = list()
var/absorbedcount = 0
var/chem_charges = 20
var/chem_recharge_rate = 0.5
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index fb01c76588a..53b2c36ea88 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,5 +1,6 @@
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
+
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
verbs += /datum/changeling/proc/EvolutionMenu
@@ -23,6 +24,15 @@
src.verbs += P.verbpath
mind.changeling.absorbed_dna |= dna
+
+ var/mob/living/carbon/human/H = src
+ if(istype(H))
+ mind.changeling.absorbed_species += H.species.name
+
+ for(var/language in languages)
+ if(!(language in mind.changeling.absorbed_languages))
+ mind.changeling.absorbed_languages += language
+
return 1
//removes our changeling verbs
@@ -63,6 +73,54 @@
return changeling
+//Used to dump the languages from the changeling datum into the actual mob.
+/mob/proc/changeling_update_languages(var/updated_languages)
+
+ languages = list()
+ for(var/language in updated_languages)
+ languages += language
+
+ return
+
+//Used to switch species based on the changeling datum.
+/mob/proc/changeling_change_species()
+
+ set category = "Changeling"
+ set name = "Change Species (5)"
+
+ var/mob/living/carbon/human/H = src
+ if(!istype(H))
+ src << "We may only use this power while in humanoid form."
+ return
+
+ var/datum/changeling/changeling = changeling_power(5,1,0)
+ if(!changeling) return
+
+ if(changeling.absorbed_species.len < 2)
+ src << "We do not know of any other species genomes to use."
+ return
+
+ var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
+ if(!S) return
+
+ domutcheck(src, null)
+
+ changeling.chem_charges -= 5
+ changeling.geneticdamage = 30
+
+ src.visible_message("[src] transforms!")
+
+ src.verbs -= /mob/proc/changeling_change_species
+ spawn(10) src.verbs += /mob/proc/changeling_change_species
+
+ H.set_species(S)
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","TR")
+
+ return 1
+
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
@@ -82,6 +140,10 @@
src << "[T] is not compatible with our biology."
return
+ if(T.species.flags & NO_SCAN)
+ src << "We do not know how to parse this creature's DNA!"
+ return
+
if(NOCLONE in T.mutations)
src << "This creature's DNA is ruined beyond useability!"
return
@@ -127,6 +189,17 @@
changeling.chem_charges += 10
changeling.geneticpoints += 2
+ //Steal all of their languages!
+ for(var/language in T.languages)
+ if(!(language in changeling.absorbed_languages))
+ changeling.absorbed_languages += language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ //Steal their species!
+ if(T.species && !(T.species.name in changeling.absorbed_species))
+ changeling.absorbed_species += T.species.name
+
if(T.mind && T.mind.changeling)
if(T.mind.changeling.absorbed_dna)
for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
@@ -260,6 +333,8 @@
O.make_changeling(1)
O.verbs += /mob/proc/changeling_lesser_transform
+ O.changeling_update_languages(changeling.absorbed_languages)
+
feedback_add_details("changeling_powers","LF")
del(C)
return 1
@@ -344,6 +419,7 @@
C.mind.transfer_to(O)
O.make_changeling()
+ O.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","LFT")
del(C)
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 9d1d94adf33..5048977789a 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -26,6 +26,12 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_transform
+/datum/power/changeling/change_species
+ name = "Change Species"
+ desc = "We take on the apperance of a species that we have absorbed."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_change_species
+
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index b7d6ad8ef76..c400185a452 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -282,6 +282,7 @@
dat += ""
for(var/datum/organ/external/e in occupant.organs)
+
dat += "
"
var/AN = ""
var/open = ""
@@ -307,13 +308,15 @@
robot = "Prosthetic:"
if(e.open)
open = "Open:"
+
var/unknown_body = 0
for(var/I in e.implants)
if(is_type_in_list(I,known_implants))
imp += "[I] implanted:"
else
unknown_body++
- if(unknown_body)
+
+ if(unknown_body || e.hidden)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 370fe714f28..8a097eaaa8b 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -62,7 +62,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
throw_speed = 0.5
item_state = "cigoff"
w_class = 1
- body_parts_covered = null
+ body_parts_covered = 0
attack_verb = list("burnt", "singed")
var/lit = 0
var/icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index b8ff0e19916..4eba07f447e 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -52,7 +52,7 @@
var/num_admins_online = 0
if(holder)
for(var/client/C in admins)
- if(R_ADMIN & C.holder.rights || !(R_MOD & C.holder.rights))
+ if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_MENTOR & C.holder.rights))
msg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey)
@@ -70,7 +70,7 @@
msg += "\n"
num_admins_online++
- else
+ else if(R_MOD & C.holder.rights || R_MENTOR & C.holder.rights)
modmsg += "\t[C] is a [C.holder.rank]"
if(isobserver(C.mob))
@@ -87,13 +87,13 @@
else
for(var/client/C in admins)
- if(R_ADMIN & C.holder.rights || !(R_MOD & C.holder.rights))
+ if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_MENTOR & C.holder.rights))
if(!C.holder.fakekey)
msg += "\t[C] is a [C.holder.rank]\n"
num_admins_online++
- else
+ else if (R_MOD & C.holder.rights || R_MENTOR & C.holder.rights)
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
- msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current Moderators([num_mods_online]):\n" + modmsg
- src << msg
\ No newline at end of file
+ msg = "Current Admins ([num_admins_online]):\n" + msg + "\n Current [config.mods_are_mentors ? "Mentors" : "Moderators"]([num_mods_online]):\n" + modmsg
+ src << msg
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 5e8af02474e..a9e428953b8 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -41,6 +41,7 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
if("sound","sounds") rights |= R_SOUNDS
if("spawn","create") rights |= R_SPAWN
if("mod") rights |= R_MOD
+ if("mentor") rights |= R_MENTOR
admin_ranks[rank] = rights
previous_rights = rights
@@ -52,7 +53,6 @@ var/list/admin_ranks = list() //list of all ranks with associated rights
testing(msg)
#endif
-
/hook/startup/proc/loadAdmins()
load_admins()
return 1
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 7bd38540174..25cf3065d05 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -1,12 +1,13 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
var/list/admin_verbs_default = list(
- /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
+// /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
/client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify*/
- /client/proc/check_antagonists /*shows all antags*/
+ /client/proc/check_antagonists, /*shows all antags*/
+ /client/proc/cmd_mentor_check_new_players
// /client/proc/deadchat /*toggles deadchat on/off*/
)
var/list/admin_verbs_admin = list(
@@ -245,6 +246,18 @@ var/list/admin_verbs_mod = list(
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message /*send an message to somebody as a 'voice in their head'*/
)
+
+var/list/admin_verbs_mentor = list(
+ /client/proc/cmd_admin_pm_context,
+ /client/proc/cmd_admin_pm_panel,
+ /datum/admins/proc/PlayerNotes,
+ /client/proc/admin_ghost,
+ /client/proc/cmd_mod_say,
+ /datum/admins/proc/show_player_info,
+// /client/proc/dsay,
+ /client/proc/cmd_admin_subtle_message
+)
+
/client/proc/add_admin_verbs()
if(holder)
verbs += admin_verbs_default
@@ -261,6 +274,7 @@ var/list/admin_verbs_mod = list(
if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds
if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn
if(holder.rights & R_MOD) verbs += admin_verbs_mod
+ if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor
/client/proc/remove_admin_verbs()
verbs.Remove(
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 1f5bd8f9059..56456775c3f 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -18,6 +18,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
+ adminhelped = 1 //Determines if they get the message to reply by clicking the name.
+
/**src.verbs -= /client/verb/adminhelp
spawn(1200)
@@ -31,6 +33,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(!msg) return
var/original_msg = msg
+
+
//explode the input msg into a list
var/list/msglist = text2list(msg, " ")
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 1989955840a..7e1b2cad97a 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -94,7 +94,10 @@
var/recieve_message = ""
if(holder && !C.holder)
- recieve_message = "-- Administrator private message --\n"
+ recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n"
+ if(C.adminhelped)
+ C << recieve_message
+ C.adminhelped = 0
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
if(config.popup_admin_pm)
@@ -180,7 +183,7 @@
//check client/X is an admin and isn't the sender or recipient
if(X == C || X == src)
continue
- if(X.key!=key && X.key!=C.key && (X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD) )
+ if(X.key!=key && X.key!=C.key && (X.holder.rights & R_ADMIN) || (X.holder.rights & (R_MOD|R_MENTOR)) )
X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [msg]" //inform X
/client/proc/cmd_admin_irc_pm()
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 086baa5877b..70fcdbf4441 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -22,7 +22,7 @@
set name = "Msay"
set hidden = 1
- if(!check_rights(R_ADMIN|R_MOD)) return
+ if(!check_rights(R_ADMIN|R_MOD|R_MENTOR)) return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
log_admin("MOD: [key_name(src)] : [msg]")
@@ -32,6 +32,10 @@
var/color = "mod"
if (check_rights(R_ADMIN,0))
color = "adminmod"
+
+ var/channel = "MOD:"
+ if(config.mods_are_mentors)
+ channel = "MENTOR:"
for(var/client/C in admins)
- if((R_ADMIN|R_MOD) & C.holder.rights)
- C << "MOD: [key_name(src,1)] (JMP): [msg]"
+ if((R_ADMIN|R_MOD|R_MENTOR) & C.holder.rights)
+ C << "[channel] [key_name(src,1)] (JMP): [msg]"
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 0d13bb1c76e..d05bb3d9e7a 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -23,6 +23,9 @@
if (src.holder.rights & R_MOD)
stafftype = "MOD"
+ if (src.holder.rights & R_MENTOR)
+ stafftype = "MENTOR"
+
if (src.holder.rights & R_ADMIN)
stafftype = "ADMIN"
@@ -44,4 +47,4 @@
else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // show the message to regular ghosts who have deadchat toggled on
M.show_message(rendered, 2)
- feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
+ feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 90fb1be8e19..26cc3a75aa6 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -65,6 +65,37 @@
message_admins("\blue \bold SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/cmd_mentor_check_new_players() //Allows mentors / admins to determine who the newer players are.
+ set category = "Admin"
+ set name = "Check new Players"
+ if(!holder)
+ src << "Only staff members may use this command."
+
+ var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
+
+ if(age == "All")
+ age = 9999999
+ else
+ age = text2num(age)
+
+ var/missing_ages = 0
+ var/msg = ""
+ for(var/client/C in clients)
+ if(C.player_age == "Requires database")
+ missing_ages = 1
+ continue
+ if(C.player_age < age)
+ msg += "[key_name_admin(C)]: account is [C.player_age] days old
"
+
+ if(missing_ages)
+ src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
+
+ if(msg != "")
+ src << browse(msg, "window=Player_age_check")
+ else
+ src << "No matches for that age range found."
+
+
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Special Verbs"
set name = "Global Narrate"
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 2a6ef51074b..81f53ec4d27 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -18,6 +18,7 @@
var/area = null
var/time_died_as_mouse = null //when the client last died as a mouse
+ var/adminhelped = 0
///////////////
//SOUND STUFF//
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 6479f9875ec..9a527b32135 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -75,13 +75,14 @@
icon_state = "rig0-mining"
item_state = "mining_helm"
item_color = "mining"
+ armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20)
/obj/item/clothing/suit/space/rig/mining
icon_state = "rig-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
-
+ armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20)
//Syndicate rig
@@ -94,7 +95,7 @@
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
- species_restricted = list("exclude","Vox")
+ species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox")
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
if(camera)
..(user)
@@ -120,7 +121,7 @@
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
siemens_coefficient = 0.6
- species_restricted = list("exclude","Vox")
+ species_restricted = list("exclude","Unathi","Tajaran","Skrell","Vox")
//Wizard Rig
@@ -153,6 +154,7 @@
icon_state = "rig0-medical"
item_state = "medical_helm"
item_color = "medical"
+ armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50)
/obj/item/clothing/suit/space/rig/medical
icon_state = "rig-medical"
@@ -160,7 +162,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has minor radiation shielding."
item_state = "medical_hardsuit"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
-
+ armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50)
//Security
/obj/item/clothing/head/helmet/space/rig/security
@@ -184,18 +186,18 @@
//Atmospherics Rig (BS12)
/obj/item/clothing/head/helmet/space/rig/atmos
- desc = "A special helmet designed for work in a hazardous, low pressure environments. Has reduced radiation shielding and protective plating to allow for greater mobility."
+ desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
name = "atmospherics hardsuit helmet"
icon_state = "rig0-atmos"
item_state = "atmos_helm"
item_color = "atmos"
- armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0)
+ armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50)
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/space/rig/atmos
- desc = "A special suit that protects against hazardous, low pressure environments. Has reduced radiation shielding to allow for greater mobility."
+ desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
icon_state = "rig-atmos"
name = "atmos hardsuit"
item_state = "atmos_hardsuit"
- armor = list(melee = 40, bullet = 0, laser = 0, energy = 0, bomb = 25, bio = 100, rad = 0)
+ armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50)
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm
index 1cb0979c89c..11f342a6d5e 100644
--- a/code/modules/mob/living/carbon/monkey/diona.dm
+++ b/code/modules/mob/living/carbon/monkey/diona.dm
@@ -21,20 +21,20 @@
processing_objects.Add(src)
/obj/item/weapon/holder/Del()
- //Hopefully this will stop the icon from remaining on human mobs.
- if(istype(loc,/mob/living))
- var/mob/living/A = src.loc
- src.loc = null
- A.update_icons()
processing_objects.Remove(src)
..()
/obj/item/weapon/holder/process()
- if(!loc) del(src)
if(istype(loc,/turf) || !(contents.len))
+
for(var/mob/M in contents)
- M.loc = get_turf(src)
+
+ var/atom/movable/mob_container
+ mob_container = M
+ mob_container.forceMove(get_turf(src))
+ M.reset_view()
+
del(src)
/obj/item/weapon/holder/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -188,7 +188,7 @@
return
src.split()
- src.visible_message("\red [src] begins to shift and quiver, and erupts in a shower of shed bark and twigs!","\red You begin to shift and quiver, then erupt in a shower of shed bark and twigs, attaining your adult form!")
+ 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.")
var/mob/living/carbon/human/adult = new(get_turf(src.loc))
adult.set_species("Diona")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7f31d737a23..93a3298b89c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -312,7 +312,7 @@
// make the icons look correct
regenerate_icons()
-
+
hud_updateflag |= 1 << HEALTH_HUD
hud_updateflag |= 1 << STATUS_HUD
return
@@ -447,9 +447,14 @@
//Getting out of someone's inventory.
if(istype(src.loc,/obj/item/weapon/holder))
- var/obj/item/weapon/holder/H = src.loc
- src.loc = get_turf(src.loc)
- del(H)
+ var/obj/item/weapon/holder/H = src.loc //Get our item holder.
+ var/mob/M = H.loc //Get our mob holder (if any).
+
+ if(istype(M))
+ M.drop_from_inventory(H)
+ M << "[H] wriggles out of your grip!"
+ src << "You wriggle out of [M]'s grip!"
+
return
//Resisting control by an alien mind.
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index a82ad655009..fba4477b1d4 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -135,7 +135,8 @@
icon_state = "working"
construction_time = 200
construction_cost = list("metal"=5000)
-
+ var/brute = 0
+ var/burn = 0
// TODO: actual icons ;)
/obj/item/robot_parts/robot_component/binary_communication_device
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 13db34f58c1..35341f111d8 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -127,7 +127,7 @@
var/datum/robot_component/cell_component = components["power cell"]
cell_component.wrapped = cell
cell_component.installed = 1
-
+
hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100")
hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
@@ -136,9 +136,9 @@
hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
-
-
+
+
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
@@ -579,6 +579,14 @@
user.drop_item()
W.loc = null
+ var/obj/item/robot_parts/robot_component/WC = W
+ if(istype(WC))
+ C.brute_damage = WC.brute
+ C.electronics_damage = WC.burn
+ else //This will nominally mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z
+ C.brute_damage = 0
+ C.electronics_damage = 0
+
usr << "\blue You install the [W.name]."
return
@@ -641,8 +649,12 @@
if(!remove)
return
var/datum/robot_component/C = components[remove]
- var/obj/item/I = C.wrapped
+ var/obj/item/robot_parts/robot_component/I = C.wrapped
user << "You remove \the [I]."
+ if(istype(I))
+ I.brute = C.brute_damage
+ I.burn = C.electronics_damage
+
I.loc = src.loc
if(C.installed == 1)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 6f770c8a71d..afdeeb81d4c 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -113,8 +113,17 @@
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
- if(!Proj.nodamage) adjustBruteLoss(Proj.damage)
+
+
+ if(!Proj.nodamage)
+ switch(Proj.damage_type)
+ if(BRUTE)
+ adjustBruteLoss(Proj.damage)
+ if(BURN)
+ adjustFireLoss(Proj.damage)
+
Proj.on_hit(src,2)
+
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
diff --git a/code/setup.dm b/code/setup.dm
index 0392d83c37a..74ac6cc5bb2 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -46,7 +46,7 @@
#define SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-helmet quality headwear. MUST NOT BE 0.
#define SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE 2.0 //what min_cold_protection_temperature is set to for space-suit quality jumpsuits or suits. MUST NOT BE 0.
-#define SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE 5000 //These need better heat protect
+#define SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE 5000 //These need better heat protect, but not as good heat protect as firesuits.
#define FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE 30000 //what max_heat_protection_temperature is set to for firesuit quality headwear. MUST NOT BE 0.
#define FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE 30000 //for fire helmet quality items (red and white hardhats)
#define HELMET_MIN_COLD_PROTECTION_TEMPERATURE 160 //For normal helmets
@@ -621,8 +621,9 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define R_SOUNDS 2048
#define R_SPAWN 4096
#define R_MOD 8192
+#define R_MENTOR 16384
-#define R_MAXPERMISSION 8192 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+#define R_MAXPERMISSION 16384 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
#define R_HOST 65535
diff --git a/code/world.dm b/code/world.dm
index c79759843a5..b3fe9940a85 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -268,9 +268,12 @@ var/world_topic_spam_protect_time = world.timeofday
if (copytext(line, 1, 2) == ";")
continue
- var/rights = admin_ranks["Moderator"]
+ var/title = "Moderator"
+ if(config.mods_are_mentors) title = "Mentor"
+ var/rights = admin_ranks[title]
+
var/ckey = copytext(line, 1, length(line)+1)
- var/datum/admins/D = new /datum/admins("Moderator", rights, ckey)
+ var/datum/admins/D = new /datum/admins(title, rights, ckey)
D.associate(directory[ckey])
/world/proc/update_status()
diff --git a/config/example/admin_ranks.txt b/config/example/admin_ranks.txt
index 031b5f6b136..e02a56df044 100644
--- a/config/example/admin_ranks.txt
+++ b/config/example/admin_ranks.txt
@@ -29,6 +29,8 @@
Admin Observer
Moderator +MOD
+Mentor +MENTOR
+
Admin Candidate +ADMIN
Trial Admin +@ +SPAWN +REJUV +VAREDIT +BAN
Badmin +@ +POSSESS +BUILDMODE +SERVER +FUN
@@ -40,4 +42,4 @@ Retired Admin +ADMIN +STEALTH
Host +EVERYTHING
Developer +DEBUG +VAREDIT +SERVER +SPAWN +REJUV +POSSESS +BUILDMODE
-Dev Mod +@ +MOD
\ No newline at end of file
+Dev Mod +@ +MOD
diff --git a/config/example/config.txt b/config/example/config.txt
index 300c23d34f1..fa8613e21d6 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -73,6 +73,12 @@ LOG_PDA
## disconnect players who did nothing during 10 minutes
# KICK_INACTIVE
+## Use Mentors instead of Moderators. Mentors are designed with the idea that
+###they help in pushing new people to be better at roleplay. If you uncomment
+###this it will reduce the rights that your mods have.
+#MENTORS
+
+
## probablities for game modes chosen in "secret" and "random" modes
##
## default probablity is 1, increase to make that mode more likely to be picked
diff --git a/icons/mob/human_races/r_diona.dmi b/icons/mob/human_races/r_diona.dmi
index ef55275d5a9..c09acaa9538 100644
Binary files a/icons/mob/human_races/r_diona.dmi and b/icons/mob/human_races/r_diona.dmi differ