Ejemplo n.º 1
0
        public NetMessage GetNoticeDevelopTech(string buyerName, string techName, DevelopTechResults result)
        {
            NetMessageStream addTechMsg = new NetMessageStream();

            addTechMsg.WriteData(buyerName);
            addTechMsg.WriteData(techName);
            addTechMsg.WriteData((int)result);

            return(addTechMsg.CreateMessage((int)MessageTypes.Rsp_DevelopTech));
        }
Ejemplo n.º 2
0
        private NetMessage WhenReqDevelopTech(ServerVisitor client, NetMessageStream msg)
        {
            string         userName    = msg.ReadData <string>();
            string         companyName = msg.ReadData <string>().Trim();
            string         techName    = msg.ReadData <string>().Trim();
            int            programSize = msg.ReadData <int>();
            List <Command> program     = new List <Command>();

            for (int i = 0; i < programSize; ++i)
            {
                Command cmd = new Command();
                cmd.ReadFromStream(msg);

                program.Add(cmd);
            }


            DevelopTechResults result = DevelopTechResults.Fail;


            // 인증
            var user = this.UserDirector.GetLoginUser(client.ID);

            if (user != null && user.Name == userName)
            {
                user = this.UserDirector.GetAccount(user.Name);
                var company = this.FindCompanyByName(companyName);

                int devFee       = program.Count * GameValues.DevFeePerProgramLine;
                int maxTechCount = this.GetCompanySiteCount(companyName) * GameValues.CompanyTechSizePerSite;

                // 유저가 존재하고
                // 존재하는 회사가 유저의 소유이고
                // 여유공간이 있고
                // 기술 이름이 유효하고
                // 개발비가 있으면

                // 해당 계정이 없으면 실패
                if (user == null)
                {
                    result = DevelopTechResults.Fail_Unauthorized;
                }
                // 해당 회사가 없거나 자신의 소유가 아니면 실패
                else if (company == null || company.Owner != user.Name)
                {
                    result = DevelopTechResults.Fail_CompanyNotExist;
                }
                // 해당 회사의 여유공간이 부족하면 실패
                else if (company.TechList.Count >= maxTechCount)
                {
                    result = DevelopTechResults.Fail_NotEnoughClearance;
                }
                // 이름이 유효하지 않으면 실패
                else if (techName.Length <= 0)
                {
                    result = DevelopTechResults.Fail_InvalidName;
                }
                // 개발비가 없으면 실패
                else if (user.Resource < devFee)
                {
                    result = DevelopTechResults.Fail_NotEnoughResource;
                }
                else
                {
                    Chip newChip = new Chip();
                    newChip.Name    = techName;
                    newChip.Program = program;

                    // 기술 이름이 중복되지 않으면
                    if (company.CheckTechOverlap(newChip) == false)
                    {
                        // 개발비 차감
                        user.Resource -= devFee;


                        // 회사에 기술 추가
                        company.AddTech(newChip);


                        // 개발 성공
                        result = DevelopTechResults.Success;
                    }
                    else
                    {
                        // 이름이 중복되면 실패
                        result = DevelopTechResults.Fail_AlreadyExist;
                    }
                }
            }
            else
            {
                // 클라이언트 이름이 올바르지 않으면 실패
                result = DevelopTechResults.Fail_Unauthorized;
            }


            // 개발 성공 알림
            NetMessageStream writer = new NetMessageStream();

            writer.WriteData(companyName);
            writer.WriteData(techName);
            writer.WriteData((int)result);

            return(this.GetNoticeDevelopTech(companyName, techName, result));
        }