03-10-2014, 11:08 PM 
		
	
	
		Вопрос в следующем:
Заметил уже в 3х разных сборках (l2phoenix, l2j, l2j lisvus) в механизме назначения новых владельцев печати сделано так, что какую то из печатей может получить проигравшая сторона. Достаточным условием для этого в алгоритме выбора является то что:
1. в выигравшей стороне за эту печать зарегистрировалось менее 35% участников
2. проигравшая сторона была предыдущим владельцем этой печати
3. в проигравшей стороне за эту печать зарегистрировалось больше 10% участников.
Эта логика идет в разрез со всеми описаниями в разных гфш базах знаний.
Прошу подсказать, такая логика является ошибочной или действительно так должно быть?
Для наглядности прилагаю код функции определяющей новых владельцев печати.
Спасибо.
			
		
	Заметил уже в 3х разных сборках (l2phoenix, l2j, l2j lisvus) в механизме назначения новых владельцев печати сделано так, что какую то из печатей может получить проигравшая сторона. Достаточным условием для этого в алгоритме выбора является то что:
1. в выигравшей стороне за эту печать зарегистрировалось менее 35% участников
2. проигравшая сторона была предыдущим владельцем этой печати
3. в проигравшей стороне за эту печать зарегистрировалось больше 10% участников.
Эта логика идет в разрез со всеми описаниями в разных гфш базах знаний.
Прошу подсказать, такая логика является ошибочной или действительно так должно быть?
Для наглядности прилагаю код функции определяющей новых владельцев печати.
Спасибо.
code
			PHP код:
<?php 
/**
     * Calculates the ownership of the three Seals of the Seven Signs,
     * based on various criterion.
     * <BR><BR>
     * Should only ever called at the beginning of a new cycle.
     */
    protected void calcNewSealOwners()
    {
        for(Integer currSeal : _signsDawnSealTotals.keySet())
        {
            int prevSealOwner = _signsSealOwners.get(currSeal);
            int newSealOwner = CABAL_NULL;
            int dawnProportion = getSealProportion(currSeal, CABAL_DAWN);
            int totalDawnMembers = getTotalMembers(CABAL_DAWN) == 0 ? 1 : getTotalMembers(CABAL_DAWN);
            int duskProportion = getSealProportion(currSeal, CABAL_DUSK);
            int totalDuskMembers = getTotalMembers(CABAL_DUSK) == 0 ? 1 : getTotalMembers(CABAL_DUSK);
            /*
             * - If a Seal was already closed or owned by the opponent and the new winner wants
             *     to assume ownership of the Seal, 35% or more of the members of the Cabal must
             *     have chosen the Seal. If they chose less than 35%, they cannot own the Seal.
             *
             * - If the Seal was owned by the winner in the previous Seven Signs, they can retain
             *     that seal if 10% or more members have chosen it. If they want to possess a new Seal,
             *     at least 35% of the members of the Cabal must have chosen the new Seal.
             */
            switch(prevSealOwner)
            {
                case CABAL_NULL:
                    switch(getCabalHighestScore())
                    {
                        case CABAL_NULL:
                            if(dawnProportion >= Math.round(0.35 * totalDawnMembers) && dawnProportion > duskProportion)
                                newSealOwner = CABAL_DAWN;
                            else if(duskProportion >= Math.round(0.35 * totalDuskMembers) && duskProportion > dawnProportion)
                                newSealOwner = CABAL_DUSK;
                            else
                                newSealOwner = prevSealOwner;
                            break;
                        case CABAL_DAWN:
                            if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = CABAL_DAWN;
                            else if(duskProportion >= Math.round(0.35 * totalDuskMembers))
                                newSealOwner = CABAL_DUSK;
                            else
                                newSealOwner = prevSealOwner;
                            break;
                        case CABAL_DUSK:
                            if(duskProportion >= Math.round(0.35 * totalDuskMembers))
                                newSealOwner = CABAL_DUSK;
                            else if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = CABAL_DAWN;
                            else
                                newSealOwner = prevSealOwner;
                            break;
                    }
                    break;
                case CABAL_DAWN:
                    switch(getCabalHighestScore())
                    {
                        case CABAL_NULL:
                            if(dawnProportion >= Math.round(0.10 * totalDawnMembers))
                                newSealOwner = prevSealOwner;
                            else if(duskProportion >= Math.round(0.35 * totalDuskMembers))
                                newSealOwner = CABAL_DUSK;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                        case CABAL_DAWN:
                            if(dawnProportion >= Math.round(0.10 * totalDawnMembers))
                                newSealOwner = prevSealOwner;
                            else if(duskProportion >= Math.round(0.35 * totalDuskMembers))
                                newSealOwner = CABAL_DUSK;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                        case CABAL_DUSK:
                            if(duskProportion >= Math.round(0.10 * totalDuskMembers))
                                newSealOwner = CABAL_DUSK;
                            else if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = prevSealOwner;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                    }
                    break;
                case CABAL_DUSK:
                    switch(getCabalHighestScore())
                    {
                        case CABAL_NULL:
                            if(duskProportion >= Math.round(0.10 * totalDuskMembers))
                                newSealOwner = prevSealOwner;
                            else if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = CABAL_DAWN;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                        case CABAL_DAWN:
                            if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = CABAL_DAWN;
                            else if(duskProportion >= Math.round(0.10 * totalDuskMembers))
                                newSealOwner = prevSealOwner;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                        case CABAL_DUSK:
                            if(duskProportion >= Math.round(0.10 * totalDuskMembers))
                                newSealOwner = prevSealOwner;
                            else if(dawnProportion >= Math.round(0.35 * totalDawnMembers))
                                newSealOwner = CABAL_DAWN;
                            else
                                newSealOwner = CABAL_NULL;
                            break;
                    }
                    break;
            }
            _signsSealOwners.put(currSeal, newSealOwner);
            // Alert all online players to new seal status.
            switch(currSeal)
            {
                case SEAL_AVARICE:
                    if(newSealOwner == CABAL_DAWN)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_LORDS_OF_DAWN_HAVE_OBTAINED_THE_SEAL_OF_AVARICE);
                    else if(newSealOwner == CABAL_DUSK)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_REVOLUTIONARIES_OF_DUSK_HAVE_OBTAINED_THE_SEAL_OF_AVARICE);
                    break;
                case SEAL_GNOSIS:
                    if(newSealOwner == CABAL_DAWN)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_LORDS_OF_DAWN_HAVE_OBTAINED_THE_SEAL_OF_GNOSIS);
                    else if(newSealOwner == CABAL_DUSK)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_REVOLUTIONARIES_OF_DUSK_HAVE_OBTAINED_THE_SEAL_OF_GNOSIS);
                    break;
                case SEAL_STRIFE:
                    if(newSealOwner == CABAL_DAWN)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_LORDS_OF_DAWN_HAVE_OBTAINED_THE_SEAL_OF_STRIFE);
                    else if(newSealOwner == CABAL_DUSK)
                        sendMessageToAll(SystemMessage.SEVEN_SIGNS_THE_REVOLUTIONARIES_OF_DUSK_HAVE_OBTAINED_THE_SEAL_OF_STRIFE);
                    break;
            }
        }
    } 

