Compare commits
No commits in common. "48c20e7a0ecd10a35843d08fe52722085183b99b" and "d2109148d32f50079e1529bde6d8a657d6df8efc" have entirely different histories.
48c20e7a0e
...
d2109148d3
|
@ -2,7 +2,7 @@
|
|||
|
||||
- Implement an ACTUAL QUEST!
|
||||
- Implement phone calls
|
||||
- Implement fast travel
|
||||
- Implement fast travel (must be unlocked by getting phone number of FASTravel)
|
||||
- Implement factory reset
|
||||
- Chats don't automatically advance now, the player has to press "Continue"
|
||||
- Add Outrun Radio, featuring "Outrun" BGM by Andrew Vice
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
- Processed by cutting out min 1:47-3:47 and applying a 10s linear crossfade at the end. Exported as ogg with quality=3, see [.kdenlive file](src/audio/JupiterRecording.kdenlive).
|
||||
- The source file has been taken down, and generally, I can't find information on how exactly this was produced. Hoping it's not a hoax.
|
||||
- Star chart based on the [HYG Stellar database](https://github.com/astronexus/HYG-Database)
|
||||
- Font Yupiter-Regular.ttf: By Yuni, SIL OPEN FONT LICENSE Version 1.1. Used FontForge to combine glyphs from:
|
||||
- Font Yupiter-Regular.ttf: By Yuni, SIL OPEN FONT LICENSE Version 1.1. Combines glyphs from:
|
||||
- Noto Sans Symbols 2, Copyright 2022 The Noto Project Authors (https://github.com/notofonts/symbols)
|
||||
- ZCOOL QingKe HuangYou, Copyright 2018 The ZCOOL QingKe HuangYou Project Authors (https://www.github.com/googlefonts/zcool-qingke-huangyou)
|
||||
- Noto Sans SC, Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'.
|
||||
|
|
40
src/chat.rs
40
src/chat.rs
|
@ -26,6 +26,10 @@ pub const CHATS: &[&str] = &[
|
|||
include_str!("chats/thebe.yaml"),
|
||||
];
|
||||
|
||||
pub const CONTACTS: &[&str] = &["travel", "tinker", "pig"];
|
||||
pub const CONTACTS_PRETTY: &[&str] = &["FASTravel", "Luna", "Mudley"];
|
||||
pub const CONTACTS_UNKNOWN: &str = "[Unknown]";
|
||||
|
||||
pub const TEXT_CONTINUE: &str = "Continue...";
|
||||
|
||||
pub const TOKEN_CHAT: &str = "chat";
|
||||
|
@ -905,6 +909,7 @@ pub fn handle_chat_scripts(
|
|||
mut ew_sfx: EventWriter<audio::PlaySfxEvent>,
|
||||
mut ew_effect: EventWriter<visual::SpawnEffectEvent>,
|
||||
mut ew_achievement: EventWriter<game::AchievementEvent>,
|
||||
mut log: ResMut<hud::Log>,
|
||||
id2pos: Res<game::Id2Pos>,
|
||||
id2v: Res<game::Id2V>,
|
||||
mut prefs: ResMut<Preferences>,
|
||||
|
@ -1044,6 +1049,28 @@ pub fn handle_chat_scripts(
|
|||
}
|
||||
}
|
||||
}
|
||||
"registercontact" => {
|
||||
if CONTACTS.contains(¶m1) {
|
||||
let param1_string = param1.to_string();
|
||||
if !prefs.contacts.contains(¶m1_string) {
|
||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Achieve));
|
||||
let name = if let Some(index) = CONTACTS.iter().position(|&x| x == param1) {
|
||||
CONTACTS_PRETTY[index]
|
||||
} else {
|
||||
"ERROR"
|
||||
};
|
||||
log.add(
|
||||
format!("Unlocked phone number: {name}!"),
|
||||
"".to_string(),
|
||||
hud::LogLevel::Achievement,
|
||||
);
|
||||
prefs.contacts.push(param1_string);
|
||||
prefs.save();
|
||||
}
|
||||
} else {
|
||||
error!("Can't register contact `{param1}', it doesn't exist in the chat::CONTACTS constant.");
|
||||
}
|
||||
}
|
||||
"installlunabackup" => {
|
||||
ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Achieve));
|
||||
prefs.luna_backup = true;
|
||||
|
@ -1083,7 +1110,18 @@ pub fn update_chat_variables(
|
|||
0
|
||||
};
|
||||
vars.set_in_scope("$", "chefhat", wears_chefhat.to_string());
|
||||
vars.set_in_scope("$", "backupinstalled", bool2chatvar(prefs.luna_backup));
|
||||
|
||||
// Set phone variables
|
||||
let mut any = false;
|
||||
for contact in CONTACTS {
|
||||
let value = prefs.contacts.contains(&contact.to_string());
|
||||
if value {
|
||||
any = true;
|
||||
}
|
||||
vars.set_in_scope("phone", contact, bool2chatvar(value));
|
||||
}
|
||||
vars.set_in_scope("phone", "any", bool2chatvar(any));
|
||||
vars.set_in_scope("luna", "backupinstalled", bool2chatvar(prefs.luna_backup));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,8 +5,7 @@ Each chat should contain:
|
|||
- A short introduction
|
||||
- A main node from which questions can be asked
|
||||
- Questions may lead into sub-nodes with more sub-questions, which have an exit option that takes you back into the main node
|
||||
- Each node shouldn't exceed 5-6 options
|
||||
- Don't assume anything about the player, don't imply anything about the player's condition. It's up to them to make up their own story
|
||||
- Each node shouldn't exceed 4-5 options
|
||||
- AVOID hiding questions until the player gains more knowledge about the NPC. While it makes things more realistic, the user experience sucks, since the user will always worry that there are some hidden conversation options that one is missing because knowledge hasn't been unlocked yet. It also makes the definition file convoluted and hard to read/understand. Open up everything from the start. Share vital info in the introduction (of the NPC or of the sub-node)
|
||||
|
||||
# Chat System Documentation
|
||||
|
|
|
@ -64,8 +64,12 @@
|
|||
- chat: BusStops
|
||||
- I wish I could use this shuttle service from anywhere!:
|
||||
- Actually, you can!
|
||||
- if phone$travel:
|
||||
- Just give us a phone call, we'll pick you up!
|
||||
- goto: fastravel
|
||||
- script: registercontact travel
|
||||
- Here's our phone number, call us any time and we'll pick you up!
|
||||
- goto: fastravel
|
||||
- if: $busstop != serenity
|
||||
Take me to Serenity Station, please.:
|
||||
- FASTravel wishes you a pleasant journey.
|
||||
|
|
|
@ -9,11 +9,25 @@
|
|||
# + ▀████████████████████████████████████████████████████▀
|
||||
|
||||
- chat: phone
|
||||
- if ~phone$any:
|
||||
- "Error: Phonebook empty."
|
||||
- goto: EXIT
|
||||
- Select contact to call.
|
||||
- FASTravel:
|
||||
- if: phone$travel
|
||||
FASTravel:
|
||||
- sound: phone
|
||||
msg: Dialing...
|
||||
- goto: travel
|
||||
- if: phone$tinker
|
||||
Luna:
|
||||
- sound: phone
|
||||
msg: Dialing...
|
||||
- goto: luna
|
||||
- if: phone$pig
|
||||
Mudley:
|
||||
- sound: phone
|
||||
msg: Dialing...
|
||||
- goto: pig
|
||||
- "[Cancel]":
|
||||
- goto: EXIT
|
||||
|
||||
|
@ -23,7 +37,7 @@
|
|||
|
||||
- label: travel
|
||||
- script: changename FASTravel
|
||||
- Welcome to FASTravel™ cargo services, how can I help you today?
|
||||
- Welcome to FASTravel™, how can I help you today?
|
||||
- label: travel_mainnode
|
||||
- Can you pick me up please?:
|
||||
- Yes! Where should we drop you off?
|
||||
|
@ -57,15 +71,77 @@
|
|||
- I changed my mind.:
|
||||
- Alright. Anything else I can help you with?
|
||||
- goto: travel_mainnode
|
||||
- Where can I find you?:
|
||||
- We advertise our stations with a large green cross.
|
||||
- Just look around, chances are that you are near one.
|
||||
- If not, simply request a pick-up and we will find you.
|
||||
- goto: travel_mainnode
|
||||
- I just wanted to say that you're awesome!:
|
||||
- Thank you so much!
|
||||
- Hearing this makes my day!
|
||||
- Satisfying our customers is what I'm programmed to live for.
|
||||
- goto: travel_mainnode
|
||||
- Good bye!:
|
||||
- goto: EXIT
|
||||
- "[Hang up]":
|
||||
- goto: EXIT
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# ---------------------------------------------------------
|
||||
# ---------------------------------------------------------
|
||||
|
||||
- label: luna
|
||||
- script: changename Luna
|
||||
- Hey, time traveler, what's up?
|
||||
- How's your research coming along?:
|
||||
- Great! This backup software is going to help a lot! Thanks again for this!
|
||||
- "[Hang up]": []
|
||||
- "[Hang up]": []
|
||||
- goto: EXIT
|
||||
|
||||
# ---------------------------------------------------------
|
||||
# ---------------------------------------------------------
|
||||
# ---------------------------------------------------------
|
||||
|
||||
- label: pig
|
||||
- script: changename Mudley
|
||||
- Heyyyy!! This is Mudley, what's up?
|
||||
- label: pig_node_main
|
||||
- Where are you hanging out?:
|
||||
- I'm at the Old Eearth Pizzeria. Come over if you wanna hang!
|
||||
- goto: pig_node_main
|
||||
- What's your story?:
|
||||
- I'm a geologist.
|
||||
- set: pig$geologist
|
||||
- set: pig$earth
|
||||
- I just loved the mud and dirt on Earth so much, I decided to study it.
|
||||
- An endlessly fascinating subject.
|
||||
- But the old rock, Earth, has been studied to the end and back.
|
||||
- No scientific frontier in geology anymore.
|
||||
- So I decided to venture into space, hoping to discover something novel.
|
||||
- Came for the science, stayed for the floooooating around!
|
||||
- I'm actually flying! Weeeeeeeee! This is so awesome!
|
||||
- goto: pig_node_main
|
||||
- if: pig$earth
|
||||
What do you miss most out here in space?:
|
||||
- The mud!
|
||||
- The space suit is quite liberating, with the comms and the appendages.
|
||||
- But I miss being nude, wallowing in the mud.
|
||||
- set: pig$mud
|
||||
- So much dust and rocks out here and I can't touch any of it.
|
||||
- It's driving me nuts!!! Aaaah!!
|
||||
- goto: pig_node_main
|
||||
- if: pig$geologist
|
||||
I have some questions about geology:
|
||||
- Shoot!
|
||||
- label: pig_node_geo
|
||||
- I've seen some gigantic moonlets around here...:
|
||||
- Yeah they keep getting ejected from the moon Thebe!
|
||||
- Thebe is so tiny, it's gravitation is about the same as its centrifugal force, so the escape velocity is almost nonexistant.
|
||||
- So a small asteroid impact can release a bunch of rocks into the orbit, some large enough to be considered moonlets.
|
||||
- Makes you wonder how anything even still remains of Thebe after all these years.
|
||||
- What's the composition of the nearby rocks?:
|
||||
- It's debris ejected from Thebe, which is mostly silicate minerals and various metals.
|
||||
- Water ice is also very abundant here, and we're extracting oxygen and water from it.
|
||||
- I've seen simple organic molecules here too, but nothing alive.
|
||||
- Nothing native, anyway.
|
||||
- That's all, thanks!:
|
||||
- Cool, anything else you wanted?
|
||||
- goto: pig_node_main
|
||||
- goto: pig_node_geo
|
||||
- "[Hang up]": []
|
||||
- goto: EXIT
|
||||
|
|
|
@ -552,7 +552,7 @@
|
|||
|
||||
|
||||
- chat: Luna
|
||||
- if $$backupinstalled:
|
||||
- if phone$luna:
|
||||
- set: begged
|
||||
- set: believe
|
||||
- set: timetravel
|
||||
|
@ -724,6 +724,19 @@
|
|||
- I just want to get away from all this insanity...
|
||||
- Just want to tinker without anyone bothering me.
|
||||
- goto: mainnode
|
||||
- if: "~phone$luna"
|
||||
Can I have your phone number?:
|
||||
- set: grateful 0
|
||||
- if $backupinstalled:
|
||||
- Of course, time traveler! Anything!
|
||||
- script: registercontact tinker
|
||||
- goto: mainnode
|
||||
- if $believe:
|
||||
- Hm... I trust you, but... I want you to do me a favor first.
|
||||
- Let me install my backup software on your space suit.
|
||||
- goto: node_spyware
|
||||
- No.
|
||||
- How do I know you're not a scammer?
|
||||
- if: "$$ar"
|
||||
You're wearing cat ears!:
|
||||
- set: grateful 0
|
||||
|
@ -1161,6 +1174,14 @@
|
|||
- But the helmet is blocking your mouth, right?
|
||||
- So first, open the space suit menu [press ESC] and take off your helmet.
|
||||
- goto: EXIT
|
||||
- if: "~phone$pig"
|
||||
Can I get your phone number?:
|
||||
- if $annoyed:
|
||||
- No.
|
||||
- goto: entrypoint
|
||||
- Sure, buddy!
|
||||
- script: registercontact pig
|
||||
- goto: entrypoint
|
||||
- Gotta go!:
|
||||
- Bye!
|
||||
- goto: EXIT
|
||||
|
|
|
@ -903,8 +903,8 @@ fn spawn_scenes(
|
|||
"fueltank" => {
|
||||
state.model = Some("fueltank".to_string());
|
||||
|
||||
// command: name "Oxygen Tank"
|
||||
state.name = Some("Oxygen Tank".to_string());
|
||||
// command: name "Fuel Tank"
|
||||
state.name = Some("Fuel Tank".to_string());
|
||||
|
||||
// command: angularmomentum 0 0 0
|
||||
state.angular_momentum = DVec3::ZERO;
|
||||
|
|
34
src/menu.rs
34
src/menu.rs
|
@ -65,11 +65,11 @@ pub enum DeathScreenEvent {
|
|||
}
|
||||
|
||||
pub const MENUDEF: &[(&str, MenuAction)] = &[
|
||||
("✆ Phone", MenuAction::PhoneCall),
|
||||
("✯ Map\n", MenuAction::ToggleMap),
|
||||
("Phone Call", MenuAction::PhoneCall),
|
||||
("", MenuAction::ToggleAR),
|
||||
("", MenuAction::ChangeARAvatar),
|
||||
("", MenuAction::ChangePointer),
|
||||
("", MenuAction::ToggleMap),
|
||||
("", MenuAction::ModLightAmp),
|
||||
("", MenuAction::ModFlashlightPower),
|
||||
("", MenuAction::ModThrusterBoost),
|
||||
|
@ -276,6 +276,16 @@ pub fn setup(
|
|||
sections.extend(Vec::from_iter(
|
||||
(0..achievement_count).map(|_| TextSection::new("", style_achievement.clone())),
|
||||
));
|
||||
sections.push(TextSection::new(
|
||||
"\nPhonebook\n",
|
||||
style_achievement_header.clone(),
|
||||
));
|
||||
sections.extend(Vec::from_iter((0..chat::CONTACTS.len()).map(|_| {
|
||||
TextSection::new(
|
||||
chat::CONTACTS_UNKNOWN.to_string() + "\n",
|
||||
style_achievement.clone(),
|
||||
)
|
||||
})));
|
||||
builder.spawn((
|
||||
MenuAchievements,
|
||||
TextBundle {
|
||||
|
@ -502,6 +512,22 @@ pub fn update_menu(
|
|||
};
|
||||
text.sections[i + 1].value = rendered[i].clone();
|
||||
}
|
||||
|
||||
// Phonebook
|
||||
for (i, contact) in chat::CONTACTS.iter().enumerate() {
|
||||
let text_index = i + achievement_bools.len() + 2;
|
||||
let registered = prefs.contacts.contains(&contact.to_string());
|
||||
text.sections[text_index].style.color = if registered {
|
||||
settings.hud_color_phonebook_unlocked
|
||||
} else {
|
||||
settings.hud_color_phonebook_locked
|
||||
};
|
||||
text.sections[text_index].value = if registered {
|
||||
chat::CONTACTS_PRETTY[i].to_string() + "\n"
|
||||
} else {
|
||||
String::from(chat::CONTACTS_UNKNOWN.to_string() + "\n")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Menu
|
||||
|
@ -600,6 +626,10 @@ pub fn update_menu(
|
|||
}
|
||||
}
|
||||
}
|
||||
MenuAction::ToggleMap => {
|
||||
let onoff = bool2string(settings.map_active);
|
||||
text.sections[i].value = format!("Map: {onoff} [M]\n");
|
||||
}
|
||||
MenuAction::ToggleCamera => {
|
||||
let onoff = if settings.third_person {
|
||||
"3rd Person"
|
||||
|
|
|
@ -81,6 +81,8 @@ pub struct Settings {
|
|||
pub hud_color_achievement: Color,
|
||||
pub hud_color_achievement_header: Color,
|
||||
pub hud_color_achievement_accomplished: Color,
|
||||
pub hud_color_phonebook_locked: Color,
|
||||
pub hud_color_phonebook_unlocked: Color,
|
||||
pub hud_color_death: Color,
|
||||
pub hud_color_death_achievements: Color,
|
||||
pub hud_color_keybindings: Color,
|
||||
|
@ -225,6 +227,8 @@ impl Default for Settings {
|
|||
hud_color_achievement: Srgba::hex(COLOR_DIM).unwrap().into(),
|
||||
hud_color_achievement_accomplished: Srgba::hex(COLOR_SUCCESS).unwrap().into(),
|
||||
hud_color_achievement_header: Srgba::hex(COLOR_PRIMARY).unwrap().into(),
|
||||
hud_color_phonebook_locked: Srgba::hex(COLOR_DIM).unwrap().into(),
|
||||
hud_color_phonebook_unlocked: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_death: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_death_achievements: Srgba::hex(COLOR_SECONDARY).unwrap().into(),
|
||||
hud_color_keybindings: Srgba::hex(COLOR_DIM).unwrap().into(),
|
||||
|
@ -481,6 +485,7 @@ pub struct Preferences {
|
|||
#[serde(default = "Preferences::default_flashlight_power")]
|
||||
pub flashlight_power: usize, // 0-2
|
||||
pub thruster_boost: usize, // 0-2
|
||||
pub contacts: Vec<String>,
|
||||
pub luna_backup: bool,
|
||||
|
||||
#[serde(skip)]
|
||||
|
|
Loading…
Reference in a new issue