top of page

C(ontinuing)E(ducation)M(odules) Adventure

Engine: Unity     
Platform: Windows     
Genre: Action

System requirements:

  • OS: Windows 7 or later

  • CPU:Intel® Core™ i7-4790 or higher level

  • RAM:16 GB or above

  • Display: NVIDIA GeForce GTX 750 Ti or higher level

  • Storage:  At least 5GB

GDWC 2022 link: https://thegdwc.com/games/1ef8bd30-8cd5-4190-8be6-fb7628d5d968

Game control

W A S D: Move the character
Space: Jump
Shift: Run
Left Mouse : Shoot bullet 1
Right Mouse: Shoot bullet 2
B: Special action
P: Pause the game

Background

Students who study in primary school or elementary school need to prepare for their admired secondary school or middle school. They are assigned much homework and attend many tutorials. As a result, stress is caused and affects students. It may lead to bad results such as students running away from home or unwilling to study.

This game is designed for primary school or elementary school students. Let them relax while playing the game because children like playing games. Players need to answer Chinese, English, Maths and Social questions and finish the stage mission in order to win the game. That can improve a player's Chinese, English, Maths and Social ability. The message is telling the students that although it is very difficult and stressful on their study, it can help their future lives.
 

Game Story

In FE0196, Martin graduated at ABC Secondary School with First Honours award and became a famous student in Hong Kong. He can get a qualification to study abroad in a high technology city called ABC(Automatically Bytes Common) city and study in ABC Science and Technology University(ASTU). During his study, he made many major scientific research results.

In FE0200, he can get a First Honours Degree graduate in Bachelor of Science (Honours) Information and Communications Technology with 4.0 CGPA. Make the Earth Federation Government and many scientific research organizations pay attention to him. Then invite him to develop an AI Government Computer for ABC city to help the ABC Government to manage the city and do an experiment.

In FE0205, AI Government Computer was completed by Martin. However, AI Government Computer is out of control. The computer replaces a human leader as a leader of ABC city and controls everything. Martin also cannot control the computer. Then he tried to send a format command to the computer. But the format command program has been divided into 8 parts and sent to C(ontinuing)E(ducation)M(odules) Dimension. To save the ABC city, he has to enter CEM Dimension to find 8 parts and recombine them.

CEM Dimension has divided different subject spaces. Each program part is kept by the boss of each subject space. Martin needs to use subject knowledge learned at school to complete the mission.
 

Game Stage

1: Prologue - Learn how to play the game
2: Chinese Dimension - Study Chinese characters
3: English Dimension - Improving the spelling of high frequency words
4: Maths Dimension - Study +-*/
5: Social Dimension
Final 1: Resurrection Bosses - Integrated of above
Final 2: Final Boss - Integrated of above

Game Play

  • Player has 50hp. If player is damaged, he will be deducted. 

  • Player has 20sp. If a player attacks, sp will deduct for each attack. Different weapons have different sp costs. If the player is not attacking, sp will recover 1 each second.

  • If player sp is become 0, player cannot attack until sp return 20.

  • Player cannot change move direct while player is not on ground.

  • If player HP less than or equal to 0. Then game over.

  • Players can continue the game by loading the save. Players can save the game at home screen or the end of dimension.

  • Players can get a new weapon when the player kills the boss.

Essence Code(C#)

Stage Clear Result

    public int stage;

    public static int Mission;
    public static float ETime;
    public static float Kill;
    public static float Damage;
    public static float Sum;
    public static float Die;
    public static int Grade;
    public static string Name;

    public float RequireTime;
    public float RequireKill;

    public Text displayMission;
    public Text displayETime;
    public Text displayKill;
    public Text displayDamage;
    public Text displaySum;
    public Text displayDie;
    public Text displayGrade;

    public Text displayMission2;
    public Text displayETime2;
    public Text displayKill2;
    public Text displayDamage2;
    public Text displayDie2;

    public Text displayName;

    string sceneName;

    // Use this for initialization
    void Start () {

        Scene currentScene = SceneManager.GetActiveScene();
        sceneName = currentScene.name;

        if (PlayerScript.Difficulty>=2)
        {
            RequireTime *= 1.25f;
        }

        Mission = 25 - LevelScore.Mission/2;
        ETime = 25- Mathf.Max((Mathf.Round((LevelScore.ETime- RequireTime) / 10)), 0);
        Kill = Mathf.Round(Mathf.Min((LevelScore.Kill/ RequireKill),1)* 25);
        Damage = 25 - (Mathf.Round(LevelScore.Damage/ 3));
        Die= Mathf.Pow(0.8f,(LevelScore.Die));
        Sum = (Mission + ETime + Kill + Damage);

        if (Sum>=0)
        {
            Die = Mathf.Pow(0.8f, (LevelScore.Die));
            displayDie.text = (Mathf.Pow(0.8f, LevelScore.Die) * 100).ToString() + "%";
        }
        else
        {
            Die = Mathf.Pow(1.2f, (LevelScore.Die));
            displayDie.text = (Mathf.Pow(1.2f, LevelScore.Die) * 100).ToString() + "%";
        }

        Sum = Mathf.Round(Sum*Die);

        if (PlayerScript.Difficulty<=0.1f&&Sum>50)
        {
            Sum = 50;
        }else if (PlayerScript.Difficulty<1 && Sum > 75)
        {
            Sum = 75;
        }

        displayMission2.text = LevelScore.Mission.ToString();
        displayETime2.text = string.Format("{0:00}:{1:00}", Mathf.FloorToInt(LevelScore.ETime / 60), Mathf.FloorToInt(LevelScore.ETime % 60));
        displayKill2.text = LevelScore.Kill.ToString();
        displayDamage2.text = LevelScore.Damage.ToString();
        displayDie2.text = LevelScore.Die.ToString();

        displayMission.text = Mission.ToString();
        displayETime.text = ETime.ToString();
        displayKill.text = Kill.ToString();
        displayDamage.text = Damage.ToString();

        displaySum.text = Sum.ToString();

        if (Sum>=95)
        {
            Grade = 7;
            displayGrade.text = "S";
        }
        else if (Sum >= 80)
        {
            Grade = 6;
            displayGrade.text = "A";
        }
        else if (Sum >= 65)
        {
            Grade = 5;
            displayGrade.text = "B";
        }
        else if (Sum >= 50)
        {
            Grade = 4;
            displayGrade.text = "C";
        }
        else if (Sum >= 40)
        {
            Grade = 3;
            displayGrade.text = "D";
        }
        else if (Sum >= 30)
        {
            Grade = 2;
            displayGrade.text = "E";
        }
        else if (Sum >= 10)
        {
            Grade = 1;
            displayGrade.text = "F";
        }
        else
        {
            Grade = 0;
            displayGrade.text = "UNCL";
        }

        if ((GameData.Name == "Ultra Master") ||(GameData.Name == "Great Master" && sceneName == "50LevelsInfernoBoss" && Sum >= 95))
        {
            Name = "Ultra Master";
        }
        else if ((GameData.Name == "Great Master")|| (sceneName == "FinalBoss2"&& Sum >=95 &&(GameData.AvgScore* GameData.Chapter- GameData.FinalBossScore+Sum)/ GameData.Chapter >= 95))
        {
            Name = "Great Master";
        }else if (Sum >= 95 && GameData.AvgScore >= 95 && GameData.Chapter >= 4)
        {
            Name = "Savior";
        }
        else if (Sum >= 95 && GameData.AvgScore >= 95 && GameData.Chapter >= 2)
        {
            Name = "Superstar";
        }
        else if (Sum >= 95 )
        {
            Name = "Hero";
        }
        else if (Sum < 30 && GameData.AvgScore < 30 && GameData.Chapter >= 4)
        {
            Name = "Loser";
        }
        else if (Sum < 30 && GameData.AvgScore < 30 && GameData.Chapter >= 2)
        {
            Name = "Ineligible";
        }
        else if (Sum < 30)
        {
            Name = "Inability";
        }
        else if (LevelScore.ETime - RequireTime <= -60)
        {
            Name = "Bolt";
        }
        else if  (LevelScore.Kill>= RequireKill*1.5&& RequireKill>=2)
        {
            Name = "Asura";
        }
        else if (LevelScore.Damage <=0)
        {
            Name = "Intact";
        }
        else if (Mission >=25)
        {
            Name = "Conscientious";
        }
        else if (ETime< 0)
        {
            Name = "Snails";
        }
        else if (LevelScore.Kill < RequireKill * (2/3) && RequireKill >= 2)
        {
            Name = "Monk";
        }
        else if (Damage < 0)
        {
            Name = "Injured";
        }
        else if (Mission < 0)
        {
            Name = "Traitor";
        }
        else if (PlayerScore.OverPower >= 2)
        {
            Name = "Over-reliance";
        }
        else if (Die<=0.9)
        {
            Name = "Zombie";
        }
        else
        {
            Name = "Warrior";
        }


        displayName.text = Name.ToString();
    }

Draw a Multiple Choice Question

    public string[] EngText;
    public int[] CorrectAnswer;
    public static int SetCorrectAnswer;
    public Text displayText;
    public static int EngTextLen;

    public static int engrand;
    // Use this for initialization
    void Start () {
        EngTextLen = EngText.Length;
        engrand = Random.Range(0, EngTextLen);
    }
   
   // Update is called once per frame
   void Update () {
        displayText.text = EngText[engrand];
        SetCorrectAnswer = CorrectAnswer[engrand];
    }

Answer a Multiple Choice Question

    public string[] Eng2bText;
    public Text displayText;
   public GameObject targetObject;
    public int gatenumber;
    public float x;
    public float y;
    public float z;
    public AudioClip correct;
    AudioSource correctAudio;
    public AudioClip damage;
    AudioSource damageAudio;


    // Use this for initialization
    void Start () {
        damageAudio = GetComponent<AudioSource>();
        correctAudio = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
        displayText.text = Eng2bText[RandEng1b.engrand];
    }
        void OnTriggerStay(Collider other){

        if (other.gameObject.name == "ThirdPersonController")
        {
            if (gatenumber == RandEng1b.SetCorrectAnswer) {

                correctAudio.PlayOneShot(correct, 1.0F);
                RandEng1b.engrand = Random.Range(0, RandEng1b.EngTextLen);
                Destroy(gameObject);
            } else {
                damageAudio.PlayOneShot(damage, 1.0F);
                HealthScript2.hp -= 10;
                    PlayerScore.Mission += 4;
                    PlayerScore.Damage += 10;
                    RandEng1b.engrand = Random.Range(0, RandEng1b.EngTextLen);
                    targetObject.transform.position = new Vector3(x, y, z);
            }
        }  

}

bottom of page