Initial STEP 3 study game and questions API
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
extends Node
|
||||
|
||||
signal session_changed
|
||||
|
||||
var active_questions: Array = []
|
||||
var answers: Array = []
|
||||
var current_index := 0
|
||||
var mode := "Tutor"
|
||||
var system_name := "All Systems"
|
||||
var seconds_remaining := 0.0
|
||||
var block_started := false
|
||||
|
||||
func start_block(selected_system: String, block_size: int, selected_mode: String) -> void:
|
||||
system_name = selected_system
|
||||
mode = selected_mode
|
||||
active_questions = QuestionBankService.build_block(selected_system, block_size)
|
||||
answers.clear()
|
||||
answers.resize(active_questions.size())
|
||||
current_index = 0
|
||||
seconds_remaining = float(active_questions.size() * 90)
|
||||
block_started = true
|
||||
session_changed.emit()
|
||||
|
||||
|
||||
func get_current_question() -> Dictionary:
|
||||
if active_questions.is_empty() or current_index < 0 or current_index >= active_questions.size():
|
||||
return {}
|
||||
return active_questions[current_index]
|
||||
|
||||
|
||||
func answer_current(choice_id: String, eliminated: Array, flagged: bool) -> Dictionary:
|
||||
var question := get_current_question()
|
||||
if question.is_empty():
|
||||
return {}
|
||||
|
||||
var answer := {
|
||||
"question": question.duplicate(true),
|
||||
"selected_choice_id": choice_id,
|
||||
"is_correct": choice_id == str(question.get("correct_choice_id", "")),
|
||||
"eliminated_choice_ids": eliminated.duplicate(),
|
||||
"flagged": flagged
|
||||
}
|
||||
answers[current_index] = answer
|
||||
session_changed.emit()
|
||||
return answer
|
||||
|
||||
|
||||
func move_previous() -> bool:
|
||||
if current_index > 0:
|
||||
current_index -= 1
|
||||
session_changed.emit()
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func move_next() -> bool:
|
||||
if current_index + 1 < active_questions.size():
|
||||
current_index += 1
|
||||
session_changed.emit()
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func move_to(index: int) -> bool:
|
||||
if index >= 0 and index < active_questions.size():
|
||||
current_index = index
|
||||
session_changed.emit()
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func get_progress_text() -> String:
|
||||
return "%d / %d" % [min(current_index + 1, active_questions.size()), active_questions.size()]
|
||||
|
||||
|
||||
func finish_block() -> Dictionary:
|
||||
var final_answers: Array = []
|
||||
for index in range(active_questions.size()):
|
||||
if answers[index] == null:
|
||||
final_answers.append({
|
||||
"question": active_questions[index].duplicate(true),
|
||||
"selected_choice_id": "",
|
||||
"is_correct": false,
|
||||
"eliminated_choice_ids": [],
|
||||
"flagged": false
|
||||
})
|
||||
else:
|
||||
final_answers.append(answers[index])
|
||||
|
||||
var results := ProgressionService.calculate_block_rewards(final_answers, mode, system_name)
|
||||
ProfileService.apply_block_results(results)
|
||||
block_started = false
|
||||
session_changed.emit()
|
||||
return results
|
||||
|
||||
|
||||
func has_answered_current() -> bool:
|
||||
return get_answer_for_index(current_index) != null
|
||||
|
||||
|
||||
func get_answer_for_index(index: int) -> Variant:
|
||||
if index < 0 or index >= answers.size():
|
||||
return null
|
||||
return answers[index]
|
||||
Reference in New Issue
Block a user