Esempio n. 1
0
 void resetUnitsInLevel(GenLevel level)
 {
     foreach (bUnit guy in level.enemyUnits)
     {
         guy.curHealth = guy.maxHealth;
     }
 }
Esempio n. 2
0
    public void loadGenLevel(GenLevel level, bool refresh)
    {
        friendlyBoard = new Slot[level.friendlySlotNum];
        enemyBoard    = new Slot[level.enemySlotNum];

        unitSelectPanel = GameObject.Find("UnitSelectPanel");

        Vector3 curSlotPos = countToPos[level.friendlySlotNum];
        float   slotOffset = countToOffset[level.friendlySlotNum];

        for (int i = 0; i < level.friendlySlotNum; i++)
        {
            GameObject tempSlotObj = Instantiate(friendSlot, curSlotPos, Quaternion.identity);
            tempSlotObj.transform.Rotate(new Vector3(270, 0, 0));
            friendlyBoard[i] = tempSlotObj.GetComponent <Slot>();
            tempSlotObj.GetComponent <Slot>().slotIndex = i;
            curSlotPos.x += slotOffset;
        }
        curSlotPos = countToPos[level.enemySlotNum] + new Vector3(0, .5f, 5);
        slotOffset = countToOffset[level.enemySlotNum];
        for (int i = 0; i < level.enemySlotNum; i++)
        {
            GameObject tempSlotObj = Instantiate(enemySlot, curSlotPos, Quaternion.identity);
            tempSlotObj.transform.Rotate(new Vector3(270, 0, 0));
            enemyBoard[i] = tempSlotObj.GetComponent <Slot>();
            tempSlotObj.GetComponent <Slot>().slotIndex = i;
            curSlotPos.x += slotOffset;
        }

        //spawn enemy units based on level
        for (int i = 0; i < Mathf.Min(level.enemyUnits.Length, level.enemySlotNum); i++)
        {
            spawnAtSlot(level.enemyUnits[i], enemyBoard[i]);
            /*enemyBoard[i].myUnitMesh.enemyAnimation();*/
            enemyBoard[i].myUnitMesh.initAnimation();
            enemyUnitCount++;
            enemyBoard[i].myUnit.isFriendly = false;
        }
        //initialize spawn buttons for player
        Vector3 buttonTransform = GameObject.Find("ButtonPlacement").transform.position;

        ih.initButtons(buttonTransform, unitSelectPanel.transform, spawnButton);

        handleBackup(refresh, level.startingCtrl);

        curPhase = GamePhase.Prep;

        mk.initMarketPhase(null);
    }
Esempio n. 3
0
    float chooseEnemiesForCount(GenLevel ret, int numEnemies)
    {
        float totDifficultyOfBoard = 0;

        ret.enemyUnits = new bUnit[numEnemies];
        for (int i = 0; i < numEnemies; i++)
        {
            BaseUnit typeToDeploy = chooseEnemy();

            /*GameObject tempUnitObj = Instantiate(gc.basicUnit, new Vector3(100, 100, 100), Quaternion.identity);
             * tempUnitObj.GetComponent<Unit>().assignType(typeToDeploy);*/
            ret.enemyUnits[i]     = new bUnit(typeToDeploy);
            totDifficultyOfBoard += ret.enemyUnits[i].myType.difficultyFactor;
        }
        return(totDifficultyOfBoard);
    }
Esempio n. 4
0
    void chooseInfUnitFor(MarketSlot sl, GenLevel levelFrom)
    {
        int  choice    = Random.Range(0, chancesTotal);
        int  total     = 0;
        bool chosenYet = false;

        for (int i = 0; i < levelFrom.availableInMarket.Length; i++)
        {
            total += levelFrom.marketUnitChances[i];
            if (choice < total)
            {
                sl.assignUnit(new bUnit(levelFrom.availableInMarket[i]));
                chosenYet = true;
                break;
            }
        }
        if (!chosenYet)
        {
            Debug.LogError("ERROR: Did not choose unit for slot");
        }
    }
Esempio n. 5
0
    // Update is called once per frame
    void Update()
    {
        if (firstTimeSetup)
        {
            if (st.isInfinite)
            {
                curLevel = lg.generateLevel(curDifficulty);
                loadGenLevel(curLevel, false);
            }
            else
            {
                loadLevel(levels[levelCount], false);
            }
            firstTimeSetup = false;
        }
        if (Input.GetKeyDown(KeyCode.Q) || Input.GetKeyDown(KeyCode.Escape))
        {
            Destroy(st.gameObject);
            SceneManager.LoadScene(0);
        }
        switch (curPhase)
        {
        case GamePhase.Prep:
            if (Input.GetKeyDown(marketKey))
            {
                unitSelectPanel.SetActive(false);
                curPhase = GamePhase.Market;
                mk.refreshInventory();
            }
            if (Mathf.CeilToInt(Camera.main.transform.eulerAngles.y) != 0)
            {
                Camera.main.transform.eulerAngles += new Vector3(0, cameraRotSpeed, 0);
            }
            break;

        case GamePhase.Battle:
            if (selected != null)
            {
                selected.GetComponent <MeshRenderer>().material = baseSlotMaterial;
                selected = null;
            }
            timer += Time.deltaTime;
            if (timer > attackDelay)
            {
                //Debug.Log("battle tick");
                timer -= attackDelay;
                if (curAttackersHighlighted)
                {
                    executeAttack();
                }
                else
                {
                    if (fightToDeath)
                    {
                        if (friendlyUnitCount > 0 && enemyUnitCount > 0)
                        {
                            //fight isn't over, initiate a new attack.
                            chooseAttackers();
                        }
                        else
                        {
                            triggerFightEnds();
                            //fight is over, determine who won/tie.
                            if (friendlyUnitCount > 0)
                            {
                                //win condition.
                                //basic next-level stuff
                                levelCount++;
                                //mk.emptyStoredMarket();
                                if (!st.isInfinite)
                                {
                                    //pre-set levels condition.
                                    if (levelCount == levels.Length)
                                    {
                                        endScreen("You Win!");
                                    }
                                    else
                                    {
                                        curPhase = GamePhase.Transition;
                                        clearLevel();
                                        loadLevel(levels[levelCount], false);
                                    }
                                }
                                else
                                {
                                    //infinite level generation condition.
                                    curDifficulty += diffIncr;
                                    curPhase       = GamePhase.Transition;
                                    clearLevel();
                                    curLevel = lg.generateLevel(curDifficulty);
                                    loadGenLevel(curLevel, false);
                                }
                            }
                            else if (enemyUnitCount > 0)
                            {
                                //loseCondition
                                string printer = "Unfortunately, you died.";
                                if (st.isInfinite)
                                {
                                    printer += "\n You beat: " + levelCount + " levels.";
                                }
                                endScreen(printer);
                            }
                            else
                            {
                                //tie condition
                                curPhase = GamePhase.Transition;
                                clearLevel();
                                ih.clearInv();
                                ih.unitInventory.AddRange(ih.invBackup);
                                if (!st.isInfinite)
                                {
                                    loadLevel(levels[levelCount], true);
                                }
                                else
                                {
                                    resetUnitsInLevel(curLevel);
                                    loadGenLevel(curLevel, true);
                                }
                            }
                            curPhase = GamePhase.Prep;
                            timer    = 0;
                            GameObject.Find("TurnPhaseText").GetComponent <Text>().text = "Prep Phase";
                        }
                    }
                    else
                    {
                        //Totally unimplemented fights that consist of a single pass through.
                        Debug.Log("One iteration attack");
                    }
                }
            }
            break;

        case GamePhase.Market:
            if (Mathf.CeilToInt(Camera.main.transform.eulerAngles.y) != 180)
            {
                Camera.main.transform.eulerAngles += new Vector3(0, cameraRotSpeed, 0);
            }
            if (Input.GetKeyDown(marketKey))
            {
                mk.endMarketPhase();
            }
            break;

        default:
            break;
        }
    }
Esempio n. 6
0
    public GenLevel generateLevel(float difficulty)
    {
        //This function works off the premise that we're trying to get the difficulty
        //float as close to zero as possible. Adding difficult things will SUBTRACT from said
        //float, while making things easier will ADD to the float.
        //I will make this better in the future I promise.



        GenLevel ret = new GenLevel();

        //Choose number of friendlies and enemies
        int numEnemies = Random.Range(2, 7);

        difficulty -= numEnemies * enemyCountWeight;
        int numFriendlies;

        if (numEnemies > 4)
        {
            numFriendlies = Random.Range(4, 7);
        }
        else
        {
            numFriendlies = Random.Range(2, 7);
        }
        difficulty         += numFriendlies * friendlyCountWeight;
        ret.enemySlotNum    = numEnemies;
        ret.friendlySlotNum = numFriendlies;



        //Setup chances of different enemies
        //for now, its a simple and dumb system.
        if (genRandChances)
        {
            unitOptionChances = new int[unitOptionsCount];

            for (int i = 0; i < unitOptionsCount; i++)
            {
                if (unitList[i].difficultyFactor * numEnemies > difficulty)
                {
                    unitOptionChances[i] = Random.Range(1, 4);
                }
                else
                {
                    unitOptionChances[i] = Random.Range(3, 8);
                }
            }
        }

        //Setup enemy board
        //NOTE: At this point, chances of various units should be set based on difficulty remaining
        difficulty -= chooseEnemiesForCount(ret, numEnemies);



        //choose available units in market
        //First, choose how many options there are.
        int numAvailableInMarket = Random.Range(2, unitOptionsCount);

        //int numAvailableInMarket = 2;
        ret.availableInMarket = new BaseUnit[numAvailableInMarket];
        //Then, choose what the options actually are.
        List <BaseUnit> optionsRemaining = new List <BaseUnit>();

        optionsRemaining.AddRange(unitList);
        for (int i = 0; i < numAvailableInMarket; i++)
        {
            BaseUnit choice = optionsRemaining[Random.Range(0, optionsRemaining.Count)];
            ret.availableInMarket[i] = choice;
            optionsRemaining.Remove(choice);
            difficulty += choice.difficultyFactor;
        }
        //Finally, choose the shop chance for each unit
        //Could be done in the above loop, but I like splitting them up for clarity.
        ret.marketUnitChances = new int[numAvailableInMarket];
        for (int i = 0; i < numAvailableInMarket; i++)
        {
            //TODO: CHANGE.
            ret.marketUnitChances[i] = (int)(10 / ret.availableInMarket[i].difficultyFactor);
        }

        //choose number of shop slots
        int numSlotsAvailable = Random.Range(3, 14);

        difficulty      += numSlotsAvailable * marketCountWeight;
        ret.numShopSlots = numSlotsAvailable;

        //If the enemy has a Jenn, the market MUST contain at least one unit capable of damaging her, e.g. it cannot be a market full of Dans.
        if (hasType("Jenn", ret.enemyUnits))
        {
            marketMustContain(ret.availableInMarket, JennCounters);
        }
        //If the enemy has a Sai, the market MUST contain either a Sai, Val, or Mark.
        if (hasType("Sai", ret.enemyUnits))
        {
            marketMustContain(ret.availableInMarket, SaiCounters);
        }

        //Finally, choose the starting ctrl at a value that attempts to offset remaining difficulty.
        if (difficulty < ctrlBoostOffset)
        {
            ret.startingCtrl = Random.Range(10, 30);
        }
        else
        {
            ret.startingCtrl = Random.Range(3, 10);
        }
        difficulty += ret.startingCtrl * ctrlWeight;

        //NEW METHOD FOR CTRL
        //Add exactly enough to offset.

        /*if(difficulty < ctrlBoostOffset)
         * {
         *  ret.startingCtrl = Mathf.CeilToInt((ctrlBoostOffset - difficulty)/ctrlWeight);
         * }*/

        /*Debug.Log("Post-generation, remaining difficulty was as follows.");
         * Debug.Log(difficulty);
         * Debug.Log("(hopefully should be close to zero)");*/

        /*Debug.Log("Units available:");
         * foreach(BaseUnit unit in ret.availableInMarket)
         * {
         *  Debug.Log(unit.unitName);
         * }
         * Debug.Log("Odds:");
         * foreach(int x in ret.marketUnitChances)
         * {
         *  Debug.Log("" + x);
         * }*/

        return(ret);
    }
Esempio n. 7
0
 public void initLevel(GenLevel level)
 {
 }
Esempio n. 8
0
    public GenFloor generateObj()
    {
        int x = 0;
        int y = 0;

//		Random.seed = System.Guid.NewGuid ().GetHashCode ();

        // TODO: (defensive) first check any required variables un-init

        GenFloor floor = new GenFloor();

        variablesList    = new List <GenVariable> ();
        variablesCounter = 1;
        eventsList       = new List <GenEvents>();
        eresultList      = new List <GenEResults>();

//		int levelNum = randomGen (levelCount);
        int levelNum = 1;

        floor.levels = new GenLevel[levelNum];

        for (int levelNo = 1; levelNo <= levelNum; levelNo++)
        {
            branchableGates = new List <GenGate> ();
            occupiedArea    = new List <Rect> ();

            GenLevel level = new GenLevel();
//			currentWorkingLevel = level;
            //level.events = new List<GenEvent> ();
            level.levelId = levelNo;

            int mainline = mainlineLength;

            // mainline generating
            level.startingRoom = genNextRoom(x, y, true, (levelNo == levelNum), mainline);

            // branch generating
            for (int i = 0; i < roomNum - mainline; i++)
            {
                GenRoom   newRoom;
                GenBridge newBridge;
                GenGate   selectedGate;

                do
                {
                    if (branchableGates.Count == 0)
                    {
                        selectedGate = null;
                        newRoom      = null;
                        newBridge    = null;
                        break;
                    }
                    int randomIndex = Random.Range(0, branchableGates.Count - 1);
                    selectedGate = branchableGates[randomIndex];
                    newBridge    = genBridge(selectedGate.x, selectedGate.y, selectedGate.direction);
                    newRoom      = genNextRoom(newBridge.x, newBridge.y, false, false, 0, (selectedGate.direction < 2 ? selectedGate.direction + 2 : selectedGate.direction - 2));
                    if (newRoom == null)
                    {
                        branchableGates.RemoveAt(randomIndex);
                    }
                } while(newRoom == null);
                if (selectedGate != null && newRoom != null && newBridge != null)
                {
                    branchableGates.Remove(selectedGate);
                    selectedGate.isGateOpen        = true;
                    selectedGate.bridge            = newBridge;
                    selectedGate.bridge.targetRoom = newRoom;

                    genGateEvent(newRoom, selectedGate.direction);
                }
            }
            //mark by gpf
//          if(levelNo == levelNum)
//             {
//              // Boss room generate
//              level.bossRoom = genNextRoom(1000, 1000, false);
//              level.bossRoom.monsters = new GenMonster[1];
//              // get a position for boss
//              // TODO: stop using silly method
//              Room roomData = new Room (level.bossRoom.roomObjId);
//              bool validPos = false;
//              Pos position = new Pos(0, 0);
//              while(!validPos) {
//                  position.x = Random.Range (0, 13);
//                  position.y = Random.Range (0, 13);
//                  if(roomData.landscape[position.y][position.x] == 1) {
//                      validPos = true;
//                  }
//              }
//              roomData.landscape[position.y][position.x] = 0;
//              level.bossRoom.monsters[0] = genMonster(0, position);
//              level.bossRoom.monsters[0].appearCondId = 0;
//              level.bossRoom.monsters [0].monsterObjId = 2;
//              // make the event that when the boss is killed, player wins
// //				level.bossRoom.monsters[0].events = new List<GenEvent>();
// //               GenEvent newGE = new GenEvent();
// //               newGE.triggerTypeId = GenEvent.TriggerType.MONSTER_DIE;
// //               newGE.results = new GenEventResult[1];
// //               GenEventResult newGER = new GenEventResult();
// //               newGER.resultTypeId = GenEvent.ResultType.FLOOR_CLEAR;
// //               newGE.results[0] = newGER;
// //               level.bossRoom.monsters[0].events.Add(newGE);
//
            //gen event added by kone
            //GenEvents genEvent = new GenEvents();
            //genEvent.eventId = 1;
            //genEvent.triggerTypeId = GenEvents.TriggerType.MONSTER_DIE;
            //genEvent.levelId = level.levelId;
            //genEvent.roomId = level.bossRoom.roomId;
            //genEvent.triggerParams = new int[1];
            //genEvent.triggerParams[0] = level.bossRoom.monsters[0].monsterId;
            //eventsList.Add(genEvent);
            //GenEResults genEResult = new GenEResults();
            //genEResult.resultTypeId = GenEResults.ResultType.FLOOR_CLEAR;
            //genEResult.eventId = 1;
            //eresultList.Add(genEResult);
//              // get char Position
//              validPos = false;
//              position = new Pos(0, 0);
//              while(!validPos) {
//                  position.x = Random.Range (0, 13);
//                  position.y = Random.Range (0, 13);
//                  if(roomData.landscape[position.y][position.x] == 1) {
//                      validPos = true;
//                  }
//              }
//              level.bossRoom.charPosition = position;
//              roomData.landscape[position.y][position.x] = 0;
//          }
            floor.levels [levelNo - 1] = level;
        }

        floor.monsters = new GenMonsterObj[3];
        // normal monster
        floor.monsters [0] = new GenMonsterObj();
        floor.monsters [0].monsterObjId    = 0;
        floor.monsters[0].monsterSettingId = monstersettingID;
        // stronger monster
        floor.monsters [1] = new GenMonsterObj();
        floor.monsters [1].monsterObjId             = 1;
        floor.monsters[1].monsterSettingId          = monstersettingID;
        floor.monsters [1].skills                   = new GenSkill[2];
        floor.monsters [1].skills [0]               = new GenSkill();
        floor.monsters [1].skills [0].skillId       = 1;
        floor.monsters [1].skills [1]               = new GenSkill();
        floor.monsters [1].skills [1].skillId       = 2;
        floor.monsters [1].skills [1].skillParam    = new int[2];
        floor.monsters [1].skills [1].skillParam[0] = 150;
        floor.monsters [1].skills [1].skillParam[1] = 5;
        // boss
        floor.monsters [2] = new GenMonsterObj();
        floor.monsters [2].monsterObjId             = 2;
        floor.monsters[2].monsterSettingId          = monstersettingID;
        floor.monsters [2].skills                   = new GenSkill[2];
        floor.monsters [2].skills [0]               = new GenSkill();
        floor.monsters [2].skills [0].skillId       = 1;
        floor.monsters [2].skills [1]               = new GenSkill();
        floor.monsters [2].skills [1].skillId       = 2;
        floor.monsters [2].skills [1].skillParam    = new int[1];
        floor.monsters [2].skills [1].skillParam[0] = 220;

        //floor.variables = variablesList.ToArray ();
        floor.events   = eventsList.ToArray();
        floor.eresults = eresultList.ToArray();

        return(floor);
    }