mob/new_player var/datum/preferences/preferences var/ready = 0 var/spawning = 0//Referenced when you want to delete the new_player later on in the code. invisibility = 101 density = 0 stat = 2 canmove = 0 anchored = 1 // don't get pushed around // var/list/jobs_restricted_by_gamemode Login() //Next line is commented out because seem it does nothing helpful and on the other hand it calls mob/new_player/Move() to EACH turf in the world. --rastaf0 //..() if(!preferences) preferences = new if(!mind) mind = new mind.key = key mind.current = src var/starting_loc = pick(newplayer_start) loc = starting_loc sight |= SEE_TURFS var/list/watch_locations = list() for(var/obj/landmark/landmark in world) if(landmark.tag == "landmark*new_player") watch_locations += landmark.loc if(watch_locations.len>0) loc = pick(watch_locations) if(!preferences.savefile_load(src, 0)) preferences.ShowChoices(src) if (!client.changes) changes() else var/lastchangelog = length('changelog.html') if (!client.changes && preferences.lastchangelog!=lastchangelog) changes() preferences.lastchangelog = lastchangelog preferences.savefile_save(src) new_player_panel() //PDA Resource Initialisation =======================================================> /* Quick note: local dream daemon instances don't seem to cache images right. Might be a local problem with my machine but it's annoying nontheless. */ if (client) //load the PDA iconset into the client src << browse_rsc('pda_atmos.png') src << browse_rsc('pda_back.png') src << browse_rsc('pda_bell.png') src << browse_rsc('pda_blank.png') src << browse_rsc('pda_boom.png') src << browse_rsc('pda_bucket.png') src << browse_rsc('pda_crate.png') src << browse_rsc('pda_cuffs.png') src << browse_rsc('pda_eject.png') src << browse_rsc('pda_exit.png') src << browse_rsc('pda_flashlight.png') src << browse_rsc('pda_honk.png') src << browse_rsc('pda_mail.png') src << browse_rsc('pda_medical.png') src << browse_rsc('pda_menu.png') src << browse_rsc('pda_mule.png') src << browse_rsc('pda_notes.png') src << browse_rsc('pda_power.png') src << browse_rsc('pda_rdoor.png') src << browse_rsc('pda_reagent.png') src << browse_rsc('pda_refresh.png') src << browse_rsc('pda_scanner.png') src << browse_rsc('pda_signaler.png') src << browse_rsc('pda_status.png') //Loads icons for SpiderOS into client src << browse_rsc('sos_1.png') src << browse_rsc('sos_2.png') src << browse_rsc('sos_3.png') src << browse_rsc('sos_4.png') src << browse_rsc('sos_5.png') src << browse_rsc('sos_6.png') src << browse_rsc('sos_7.png') src << browse_rsc('sos_8.png') src << browse_rsc('sos_9.png') src << browse_rsc('sos_10.png') src << browse_rsc('sos_11.png') src << browse_rsc('sos_12.png') src << browse_rsc('sos_13.png') src << browse_rsc('sos_14.png') //End PDA Resource Initialisation =====================================================> Logout() ready = 0 ..() if(!spawning)//Here so that if they are spawning and log out, the other procs can play out and they will have a mob to come back to. key = null//We null their key before deleting the mob, so they are properly kicked out. del(src) return verb new_player_panel() set src = usr new_player_panel_proc() proc new_player_panel_proc() var/output = "New Player Options" /*output += " | Refresh
" output += "Name: [preferences.be_random_name ? "Random" :preferences.real_name]"*/ output +="
" /*output += "Preferred jobs:
" output += "[preferences.occupation[1]]
" output += "[preferences.occupation[2]]
" output += "[preferences.occupation[3]]
"*/ output += "
Setup Character

" if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) if(!ready) output += "Declare Ready
" else output += "You are ready (Cancel)
" else output += "Join Game!
" output += "
Observe
" src << browse(output,"window=playersetup;size=250x210;can_close=0") Stat() ..() statpanel("Game") if(client.statpanel=="Game" && ticker) if(ticker.hide_mode) stat("Game Mode:", "Secret") else stat("Game Mode:", "[master_mode]") if((ticker.current_state == GAME_STATE_PREGAME) && going) stat("Time To Start:", ticker.pregame_timeleft) if((ticker.current_state == GAME_STATE_PREGAME) && !going) stat("Time To Start:", "DELAYED") statpanel("Lobby") if(client.statpanel=="Lobby" && ticker) if(ticker.current_state == GAME_STATE_PREGAME) for(var/mob/new_player/player in world) stat("[player.key]", (player.ready)?("(Playing)"):(null)) Topic(href, href_list[]) if(href_list["show_preferences"]) preferences.ShowChoices(src) return 1 if(href_list["ready"]) if (!src.client.authenticated) src << "You are not authorized to enter the game." return if(!ready) ready = 1 else ready = 0 if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window new_player_panel_proc() if(href_list["observe"]) if (!usr.client.authenticated) src << "You are not authorized to enter the game." return if(alert(src,"Are you sure you wish to observe? You will not be able to play this round!","Player Setup","Yes","No") == "Yes") var/mob/dead/observer/observer = new() spawning = 1 close_spawn_windows() var/obj/O = locate("landmark*Observer-Start") src << "\blue Now teleporting." observer.loc = O.loc observer.key = key if(preferences.be_random_name) preferences.randomize_name() observer.name = preferences.real_name observer.real_name = observer.name del(src) return 1 if(href_list["late_join"]) LateChoices() if(href_list["SelectedJob"]) if (!usr.client.authenticated) src << "You are not authorized to enter the game." return if (!enter_allowed) usr << "\blue There is an administrative lock on entering the game!" return switch(href_list["SelectedJob"]) if ("1") AttemptLateSpawn("Captain", captainMax) if ("2") AttemptLateSpawn("Head of Security", hosMax) if ("3") AttemptLateSpawn("Head of Personnel", hopMax) if ("4") AttemptLateSpawn("Station Engineer", engineerMax) if ("5") AttemptLateSpawn("Bartender", barmanMax) if ("6") AttemptLateSpawn("Scientist", scientistMax) if ("7") AttemptLateSpawn("Chemist", chemistMax) if ("8") AttemptLateSpawn("Geneticist", geneticistMax) if ("9") AttemptLateSpawn("Security Officer", securityMax) if ("10") AttemptLateSpawn("Medical Doctor", doctorMax) if ("11") AttemptLateSpawn("Atmospheric Technician", atmosMax) if ("12") AttemptLateSpawn("Detective", detectiveMax) if ("13") AttemptLateSpawn("Chaplain", chaplainMax) if ("14") AttemptLateSpawn("Janitor", janitorMax) if ("15") AttemptLateSpawn("Clown", clownMax) if ("16") AttemptLateSpawn("Chef", chefMax) if ("17") AttemptLateSpawn("Roboticist", roboticsMax) if ("18") AttemptLateSpawn("Assistant", 10000) if ("19") AttemptLateSpawn("Quartermaster", cargoMax) if ("20") AttemptLateSpawn("Research Director", directorMax) if ("21") AttemptLateSpawn("Chief Engineer", chiefMax) if ("22") AttemptLateSpawn("Botanist", hydroponicsMax) if ("23") AttemptLateSpawn("Librarian", librarianMax) if ("24") AttemptLateSpawn("Virologist", viroMax) if ("25") AttemptLateSpawn("Lawyer", lawyerMax) if ("26") AttemptLateSpawn("Cargo Technician", cargotechMax) if ("27") AttemptLateSpawn("Chief Medical Officer", cmoMax) if ("28") AttemptLateSpawn("Warden", wardenMax) if ("29") AttemptLateSpawn("Shaft Miner", minerMax) if ("30") AttemptLateSpawn("Mime", mimeMax) if(!ready && href_list["preferences"]) preferences.process_link(src, href_list) else if(!href_list["late_join"]) new_player_panel() proc/IsJobAvailable(rank, maxAllowed) if(countJob(rank) < maxAllowed && !jobban_isbanned(src,rank)) return 1 else return 0 proc/AttemptLateSpawn(rank, maxAllowed) if(IsJobAvailable(rank, maxAllowed)) var/mob/living/carbon/human/character = create_character() var/icon/char_icon = getFlatIcon(character,0)//We're creating out own cache so it's not needed. if (character) character.Equip_Rank(rank, joined_late=1) if(character.mind) if(character.mind.assigned_role != "Cyborg") ManifestLateSpawn(character,char_icon) if(ticker) character.loc = pick(latejoin) AnnounceArrival(character, rank) if(character.mind) if(character.mind.assigned_role == "Cyborg") character.Robotize() else//Adds late joiners to minds so they can be linked to objectives. ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. del(src) else src << alert("[rank] is not available. Please try another.") proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank) if (ticker.current_state == GAME_STATE_PLAYING) var/ailist[] = list() for (var/mob/living/silicon/ai/A in world) if (!A.stat) ailist += A if (ailist.len) var/mob/living/silicon/ai/announcer = pick(ailist) if(character.mind) if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE")) announcer.say("[character.real_name] has signed up as [rank].") proc/ManifestLateSpawn(var/mob/living/carbon/human/H, icon/H_icon) // Attempted fix to add late joiners to various databases -- TLE // This is basically ripped wholesale from the normal code for adding people to the databases during a fresh round if (!isnull(H.mind) && (H.mind.assigned_role != "MODE")) var/datum/data/record/G = new() var/datum/data/record/M = new() var/datum/data/record/S = new() var/datum/data/record/L = new() var/obj/item/weapon/card/id/C = H.wear_id if (C) G.fields["rank"] = C.assignment else G.fields["rank"] = "Unassigned" G.fields["name"] = H.real_name G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6)) M.fields["name"] = G.fields["name"] M.fields["id"] = G.fields["id"] S.fields["name"] = G.fields["name"] S.fields["id"] = G.fields["id"] if (H.gender == FEMALE) G.fields["sex"] = "Female" else G.fields["sex"] = "Male" G.fields["age"] = text("[]", H.age) G.fields["fingerprint"] = text("[]", md5(H.dna.uni_identity)) G.fields["p_stat"] = "Active" G.fields["m_stat"] = "Stable" M.fields["b_type"] = text("[]", H.b_type) M.fields["b_dna"] = H.dna.unique_enzymes M.fields["mi_dis"] = "None" M.fields["mi_dis_d"] = "No minor disabilities have been declared." M.fields["ma_dis"] = "None" M.fields["ma_dis_d"] = "No major disabilities have been diagnosed." M.fields["alg"] = "None" M.fields["alg_d"] = "No allergies have been detected in this patient." M.fields["cdi"] = "None" M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." M.fields["notes"] = "No notes." S.fields["criminal"] = "None" S.fields["mi_crim"] = "None" S.fields["mi_crim_d"] = "No minor crime convictions." S.fields["ma_crim"] = "None" S.fields["ma_crim_d"] = "No major crime convictions." S.fields["notes"] = "No notes." //Begin locked reporting L.fields["name"] = H.real_name L.fields["sex"] = H.gender L.fields["age"] = H.age L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") L.fields["rank"] = H.mind.assigned_role L.fields["b_type"] = H.b_type L.fields["b_dna"] = H.dna.unique_enzymes L.fields["enzymes"] = H.dna.struc_enzymes L.fields["identity"] = H.dna.uni_identity L.fields["image"] = H_icon//What the person looks like. Naked, in this case. //End locked reporting data_core.general += G data_core.medical += M data_core.security += S data_core.locked += L return // This fxn creates positions for assistants based on existing positions. This could be more elegant. proc/LateChoices() var/dat = "" dat += "Choose from the following open positions:
" if (IsJobAvailable("Captain",captainMax)) dat += "Captain
" if (IsJobAvailable("Head of Security",hosMax)) dat += "Head of Security
" if (IsJobAvailable("Head of Personnel",hopMax)) dat += "Head of Personnel
" if (IsJobAvailable("Research Director",directorMax)) dat += "Research Director
" if (IsJobAvailable("Chief Engineer",chiefMax)) dat += "Chief Engineer
" if (IsJobAvailable("Station Engineer",engineerMax)) dat += "Station Engineer
" if (IsJobAvailable("Bartender",barmanMax)) dat += "Bartender
" if (IsJobAvailable("Scientist",scientistMax)) dat += "Scientist
" if (IsJobAvailable("Chemist",chemistMax)) dat += "Chemist
" if (IsJobAvailable("Geneticist",geneticistMax)) dat += "Geneticist
" if (IsJobAvailable("Security Officer",securityMax)) dat += "Security Officer
" if (IsJobAvailable("Medical Doctor",doctorMax)) dat += "Medical Doctor
" if (IsJobAvailable("Atmospheric Technician",atmosMax)) dat += "Atmospheric Technician
" if (IsJobAvailable("Detective",detectiveMax)) dat += "Detective
" if (IsJobAvailable("Chaplain",chaplainMax)) dat += "Chaplain
" if (IsJobAvailable("Janitor",janitorMax)) dat += "Janitor
" if (IsJobAvailable("Clown",clownMax)) dat += "Clown
" if (IsJobAvailable("Mime",mimeMax)) dat += "Mime
" if (IsJobAvailable("Chef",chefMax)) dat += "Chef
" if (IsJobAvailable("Roboticist",roboticsMax)) dat += "Roboticist
" if (IsJobAvailable("Quartermaster",cargoMax)) dat += "Quartermaster
" if (IsJobAvailable("Botanist",hydroponicsMax)) dat += "Botanist
" if (IsJobAvailable("Librarian",librarianMax)) dat += "Librarian
" if (IsJobAvailable("Virologist",viroMax)) dat += "Virologist
" if (IsJobAvailable("Lawyer",lawyerMax)) dat += "Lawyer
" if (IsJobAvailable("Cargo Technician",cargotechMax)) dat += "Cargo Technician
" if (IsJobAvailable("Chief Medical Officer",cmoMax)) dat += "Chief Medical Officer
" if (IsJobAvailable("Warden", wardenMax)) dat += "Warden
" if (IsJobAvailable("Shaft Miner",minerMax)) dat += "Shaft Miner
" if (!jobban_isbanned(src,"Assistant")) dat += "Assistant
" src << browse(dat, "window=latechoices;size=300x640;can_close=0") proc/create_character() spawning = 1 var/mob/living/carbon/human/new_character = new(loc) close_spawn_windows() preferences.copy_to(new_character) new_character.dna.ready_dna(new_character) if(mind) mind.transfer_to(new_character) mind.original = new_character return new_character Move() return 0 proc/close_spawn_windows() src << browse(null, "window=latechoices") //closes late choices window src << browse(null, "window=playersetup") //closes the player setup window