Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: T-800 Mod
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic > Heroes II
Страницы: 1, 2, 3, 4, 5
t800
На Google Play мне пожаловались что заклинание Молния в битве выгляди совсем не правильно, хотя заклинание Ледяной Луч выглядит точно так же как в оригинальных HMM2




Стал разбираться. Запишу что понял чтобы не забыть

Судя по всему заклинания рисуются в файле /src/fheroes2/battle/battle_interface.cpp

Вот это заклинание Молния

Код
void Battle::Interface::RedrawActionLightningBoltSpell(Unit & target)
{
    // FIX: LightningBolt draw
    RedrawTroopWithFrameAnimation(target, ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}

void Battle::Interface::RedrawActionChainLightningSpell(const TargetsInfo & targets)
{
    // FIX: ChainLightning draw
    //AGG::PlaySound(targets.size() > 1 ? M82::CHAINLTE : M82::LIGHTBLT);

    for(TargetsInfo::const_iterator
    it = targets.begin(); it != targets.end(); ++it)
    RedrawTroopWithFrameAnimation(*(it->defender), ICN::SPARKS, M82::FromSpell(Spell::LIGHTNINGBOLT), true);
}



А вот это заклинание Ледяной Луч


Код
void Battle::Interface::RedrawActionColdRaySpell(Unit & target)
{
    Display & display = Display::Get();
    Cursor & cursor = Cursor::Get();
    LocalEvent & le = LocalEvent::Get();

    const int icn = ICN::COLDRAY;
    u32 frame = 0;

    Point pt_from, pt_to;
    const HeroBase* current_commander = arena.GetCurrentCommander();

    if(current_commander == opponent1->GetHero())
    {
    const Rect & pos1 = opponent1->GetArea();
    pt_from = Point(pos1.x + pos1.w, pos1.y + pos1.h / 2);

    const Rect & pos2 = target.GetRectPosition();
    pt_to = Point(pos2.x, pos2.y);
    }
    else
    {
    const Rect & pos = opponent2->GetArea();
    pt_from = Point(pos.x, pos.y + pos.h / 2);

    const Rect & pos2 = target.GetRectPosition();
    pt_to = Point(pos2.x + pos2.w, pos2.y);
    }

    const u32 dx = std::abs(pt_from.x - pt_to.x);
    const u32 dy = std::abs(pt_from.y - pt_to.y);
    const u32 step = (dx > dy ? dx / AGG::GetICNCount(icn) : dy / AGG::GetICNCount(icn));


    const Points points = GetLinePoints(pt_from, pt_to, step);
    Points::const_iterator pnt = points.begin();

    cursor.SetThemes(Cursor::WAR_NONE);
    AGG::PlaySound(M82::COLDRAY);

    while(le.HandleEvents() && frame < AGG::GetICNCount(icn) && pnt != points.end())
    {
    CheckGlobalEvents(le);

    if(Battle::AnimateInfrequentDelay(Game::BATTLE_SPELL_DELAY))
        {
        cursor.Hide();
        const Sprite & sprite = AGG::GetICN(icn, frame);
        sprite.Blit((*pnt).x - sprite.w() / 2, (*pnt).y - sprite.h() / 2);
        cursor.Show();
        display.Flip();

        ++frame;
        ++pnt;
    }
    }

    RedrawTroopWithFrameAnimation(target, ICN::ICECLOUD, M82::UNKNOWN, true);
}



Видно что они совершенно по разному сделаны и в этом причина почему молния выгляди совсем не правильно и
бьет какой то тонкой линией сверху вместо того чтобы бить молнией из посоха Героя как Ледяной Луч.

Думаю надо передалать Молнию так же как Ледяной Луч и тогда она будет бить нормально и из Посоха героя.
t800
Так ну я передалал Молнию по подобию Ледяного луча.
Теперь она бьет из героя, а не понятно откуда и центра карты.
Но есть проблема. Дело в том что ресурсах нет спрайтов удара молнии.
Наверное в оригинальных героях ее рисовали как-то по другому.

Я вот попробовал сделать спрайт сам. Но стокнулся с проблемой. Что молния должна красиво смотреться под
когда разным углом, у меня получается что под каким-то углом она смотрится еще нормально а под другим совсем плохо.



И как слелать так чтобы под всеми углами нормально было?



t800
Захотел сделать портреты героев для новой кампании Король Осминогов.
Решил начать с портрета Лорда Гарретта


Лорд Гарретт Чародей
t800
Вот переделал немного Чародея Лорда Гарретта
Дал ему артифакт и плащ Волшебника
Господин Уэф
А в этой сборке кеш обязательно нужно в определенное место класть или можно путь задать? Просто мой планшет маниакально ставит все во внутреннюю память без возможности переноса на флешку, и я хотел бы, чтобы хотя бы кем не занимал основную память, а лежал на флеш.
t800
Цитата(Господин Уэф @ 05 Sep 2016, 13:39) *
А в этой сборке кеш обязательно нужно в определенное место класть или можно путь задать? Просто мой планшет маниакально ставит все во внутреннюю память без возможности переноса на флешку, и я хотел бы, чтобы хотя бы кем не занимал основную память, а лежал на флеш.



Можно задать любой путь



так же путь к папке DATA можно прописать вручную в fheroe2.cfg

Код
# path to directory data
data = DATA


где вместо DATA прописасть /Ваши полный путь на флешке к папке/DATA
Господин Уэф
Наконец решился поставить и попробовать. В качестве кеша использовал рип-версию с сайта old-games. Впечатления в целом положительные, автору респект. Кроме того, есть надежда на дальнейшее развитие, в отличие от оригинальных fh2.

И, да, банальный вопрос - если я не хочу пользоваться загружаемой демой, какие файлы от оригинальной игры мне нужны? Только те, что в папках data и maps?
t800
Цитата(Господин Уэф @ 05 Sep 2016, 15:13) *
И, да, банальный вопрос - если я не хочу пользоваться загружаемой демой, какие файлы от оригинальной игры мне нужны? Только те, что в папках data и maps?


Для работы из оригинальной игры нужны только файлы heroes2.agg и heroes2x.agg из папки DATA и карты из папки MAPS.
Господин Уэф
А нельзя сделать, чтобы игровые настройки (скорость, боевая сетка, интерфейс) сохранились? А то приходится при каждом заходе в игру заново выставлять.
t800
Цитата(Господин Уэф @ 07 Sep 2016, 14:58) *
А нельзя сделать, чтобы игровые настройки (скорость, боевая сетка, интерфейс) сохранились? А то приходится при каждом заходе в игру заново выставлять.


В панели настроек можно задать сохранение сетки и интерфейса




А скорость можно прописать в fheroes2.cfg

Код
# heroes move speed: 0 - 10
heroes speed = 10
#
# AI move speed: 0 - 10
ai speed = 10
#
# battle speed: 0 - 10
battle speed = 10
#
# scroll speed: 1 - 4
scroll speed = 4
t800
В школе в понедельник будет в нашем классе класный час (6 урок dunno.gif ), и мне захотелось пригласить ребят на турнир. Для этого я приготовил листовку, которую я там, на классном часу, раздам. Вот она:

t800
На прошлой неделе Нашу Школу показывали по TВ и это кусочек где со мной разговаривают

DrSlash
Ролик шедевр biggrin.gif BolgenOS 2.0
tolich
Цитата(DrSlash @ 04 Oct 2016, 21:53) *
Ролик шедевр biggrin.gif BulgenOS 2.0
BolgenOS!
DrSlash
fixed.
t800
Цитата(tolich @ 05 Oct 2016, 01:37) *
Цитата(DrSlash @ 04 Oct 2016, 21:53) *
Ролик шедевр biggrin.gif BulgenOS 2.0
BolgenOS!


Не знаю, а мне понравилось только уши получилсь как у Эльфа, а то что тетенька от себя наговорила, тут уж dunno.gif
я же ей сказал, что сделал только одну кампанию и изменил портреты, а она наверно вобще не поняла, что такое T-800 mod и название сборки не правильно назвала вместо Свободные Герои 2 (T-800 Mod) сказала просто Свободные Герои, а это сборка Герхарда Стейна так называется, получается что она про его сборку рассказывает а не про мою! Ну да ладно.
t800
Цитата(tolich @ 05 Oct 2016, 01:37) *
Цитата(DrSlash @ 04 Oct 2016, 21:53) *
Ролик шедевр biggrin.gif BulgenOS 2.0
BolgenOS!


ЗЫ Почитал про BolgenOS на Лукморье... Хммм... Вроде никаких копирайтов не вырезал. Почему 2.0? Или потому про учителя информатики сказал так там же директор и классный руководитель сидели рядом.
DrSlash
t800, потому что журналисты пытаются придать сенсационности и раздуть новость там, где её в общем-то и нет.
t800
Цитата(DrSlash @ 05 Oct 2016, 03:45) *
t800, потому что журналисты пытаются придать сенсационности и раздуть новость там, где её в общем-то и нет.


Понятно, как Крош в Смешариках:


Цитата
Крош: Всё дело в заголовке! Заголовок должен быть такой, чтобы страсть как интересно было узнать, что же там такое написано! Например: «РАДУГА-МУТАНТ»! Или: «Последняя радуга в жизни», вот!
Нюша: (читает газету) «Катастрофа на качелях». Хи-хи-хи. «Ничто не предвещало трагической развязки. Нюша беззаботно качалась на качелях, как вдруг…» ЧТО?! (в доме Карыча, обустроенном под редакцию) Что вы тут напечатали?! Какая катастрофа? Какая трагическая развязка?! Это всё неправда!

Крош: «Правда» — это другая газета, а наша — чтобы скучно не было!


ЗЫ Ну и пускай если так им нравится. Если бы еще сборку хотя б назвали правильно, а то получилось раздули сборку Герхарда, а в ней ни одна кампания не работает и половина карт вылетает.
t800

Вот сделал портрет главного героя кампании Король Осминогов в Золотом Шлеме

Sir Aratzev (Рыцарь)



О герое: Sir Aratzev получил Золотой Шлем за Блистальную победу над Терминатором за 84 дня.

t800
На HandBookHM когда обсуждали прошедший турнир решили, что надо сделать в игре сделать турнирную вкладку в игру и каждый месяц делать обновления и добавлять в нее новую турнирую карту а результаты прошедшего турнира на автомате выводить в таблице с игрой.

Я могу сделать кнопку ТУРНИР чтобы из нее запускалась одиночная турнирная карта (сделанную из сейва) наприме из папки turnir (это я знаю как сделать) и могу переделать в кнопку ТУРНИР кнопку Сетевая Игра (которая все равно не работает и на которую все ругаются что кнопка есть а игра по сети не работает), просто с отсылкой сейвов не знаю как быть.

Нада сделать чтобы из самой игры можно было послать финальный сейв и тогда каждый кто сыграл ТУРНИРНУЮ карту стал бы учасником и чьи сейвы бы пришли до окончания турнира те бы засчитвались, или еще сделать чтобы игра делала проверку на время окончания турнира и если турнир закончился сейвы не посылала. Просто не могу понять как сделать чтобы сейвы из игры на e-mail посылались.
t800
Так ну я вот нашел какой то пример в SDL 1.2 как посылать сообщение "Hello!" по сети


Код
// send a hello over sock
//TCPsocket sock;
int len,result;
char *msg="Hello!";

len=strlen(msg)+1; // add one for the terminating NULL
result=SDLNet_TCP_Send(sock,msg,len);
if(result<len) {
    printf("SDLNet_TCP_Send: %s\n", SDLNet_GetError());
    // It may be good to disconnect sock because it is likely invalid now.
}


Но мне надо послать не "Hellо!" а файлы autosave.sav, fheroes2.hgsc и fheroes2.hgs
но как послать файлы в примерах ничего не написано. Как это сделать?
DrSlash
А зачем весь сейв? Тогда уж какие-то основные переменные -- число ходов, сумма первичных параметров сильнейшего героя, ресурсы. А тут уже не должно быть каких-то принципиальных отличий от "Hello!".
t800
Цитата(DrSlash @ 06 Oct 2016, 19:10) *
А зачем весь сейв? Тогда уж какие-то основные переменные -- число ходов, сумма первичных параметров сильнейшего героя, ресурсы. А тут уже не должно быть каких-то принципиальных отличий от "Hello!".


Сейв нужен чтобы ведущий турнира мог сделать проверку и переиграть, вон на прошедшем турнире Qwerty вообще сказал надо проверять сейвы за каждый день (на начало и на конец дня) потому, что многие игроки открывают сейв в HEX редакторе меняют их на мультиплеер, а потом ходят за компьюр так чтобы тот проиграл.

Можно было бы сделать чтобы просто посылалось сообщение "Турнирную карту выиграл "Имя Игрока" за "Столько-то" дней", но ведущему такой вариант не подходит надо чтобы кроме сообщения отсылались файлы autosave.sav, fheroes2.hgsc и fheroes2.hgs , ну или хотя бы только autosave.sav
feanor
Вот эта штука, которую ты процитировал, это отнюдь не посылка на емэйл, это просто низкоуровневый обмен сетевыми данными.
Конечно, можно поверх этой штуки реализовать мыльник вручную, SMTP - не самая сложная штука, но лучше все же что-то готовое
например, консольный мыльник в папке и вызов уже его
t800
Цитата(feanor @ 06 Oct 2016, 19:26) *
Вот эта штука, которую ты процитировал, это отнюдь не посылка на емэйл, это просто низкоуровневый обмен сетевыми данными.
Конечно, можно поверх этой штуки реализовать мыльник вручную, SMTP - не самая сложная штука, но лучше все же что-то готовое
например, консольный мыльник в папке и вызов уже его


Консольный мыльник это почтовая программа которая из командной строки работает? А есть такой чтоб работал на Linux, Windows и Andriod и чтоб его можно было в сборку для Google Play включить и чтоб из-за этого никто не стал ругаться?
t800
Так в гугле по запросу отправить письмо из консоли Android я нашел только одну программу. Она называется Curl. Вот она https://curl.haxx.se/download.html и вроде она есть и под Linux и под Windows, а как мне из игры команды ей подать чтобы она e-mail c файлами отправила?
t800
Так кажется разобрался как запускать другую программу из игры с помощью system() вот так

Код
#include <stdio.h>      
#include <stdlib.h>    

int main ()
{
system ("И тут можно написать любую  команду для консоли");
}



Осталось токлько разобраться какой командой надо запускать Curl чтоб он отравлял на e-mail файлы autosave.sav и другие и задача решена! barb_metal.gif barb_metal.gif barb_metal.gif И я этому так обрадовался что даже записал новый урок по Программированию на С++ про команду system() brags.gif

t800
Так вроде нашел команды для Ubuntu как отправлять файл по е-mail Curl-ом запишу чтобы не потерялись

Сперва:

Код
echo -e "MIME-Version: 1.0 (mime-construct 1.9)\nContent-Type: application/zip\nContent-Transfer-Encoding: base64" > email-contents.txt cat autosave.sav |base64 >> email-contents.txt


Потом

Код
curl --connect-timeout 15 -v --insecure "smtp://smtp.example.com:25" -u "username:password"
\ --mail-from "sender@example.com" --mail-rcpt "destination@example.com"
\ -T email-contents.txt --ssl
t800
Так ну вроде получилось письмо с сейвом из Ubuntu отосласть

Вот правильные каманды



Код
echo -e "Subject: Turnir\n MIME-Version: 1.0\n Content-Disposition: attachment;\n filename="autosave.sav"\n Content-Transfer-Encoding: base64\n Content-Type: application/octet-stream;\n name="autosave.sav"\n" > email-contents.txt


Потом

Код
base64  autosave.sav >> email-contents.txt


B конце

Код
curl "smtp://wiki.kvkozyrev.org:25" --mail-from "t800@kvkozyrev.org" --mail-rcpt "t800@kvkozyrev.org"  -T email-contents.txt


И тогда на почту приходит письмо с автосейвом.

ЗЫ Правда работают этм каманды только под Ubuntu тепеть надо разоботься как это сделать в Windows и Android
t800
Скачал в Andriond 5.0 который у меня стои в Virtualbox curl который собран для Andriod https://curl.haxx.se/download.html

Хмм... Честно говоря как то не очень получается... Во-первых оказалось что с SDcard и папки где лежат игры его запускать нельзя потому что прав у него нету и если пыпасться поставить права командой

Код
chmod 777 curl


Права не устанавливаются. Я погуглил оказывается в Andriond для всего что лежит на SDcard права заданы только на чтение-запись и чтобы curl запустился надо положить его в папку system/bin

Тогда я cкопироал curl в папку system/bin

Код
cp curl system/bin


Присвоил ему права на выполнение

Код
chmod 777 /system/bin/curl



запусил камандой curl и получил ошибку

Код
sh:system/bin/curl: not executable: 32 ELF file


Погуглил ошибку оказалось что это значит что программа собрана без поддержки x86 budo.gif

Хммм... Как то не очень хорошо с этим curl под Аndriod получается


И как быть? Как я понимаю: можно попробовать собрать свой curl под Android из исходников так чтобы нужные мне устройства он поддерживал потому что исходники curl на https://curl.haxx.se/download.html есть

И еще я подумал а может просто попробовать скопировть из curl те каманды где он отправляет e-mail и
пусть игра сама письмо отравляет без всякого curl ? Потому что из папки где лежат файлы игры curl работать не будет и получается надо делать еще установку curl и в папку system/bin его кидать и права ему как-то присваивать, а чтобы это сделать надо root быть и как это сделать чтобы при установке на чужих устройствах получалось не совсем понятно.
t800
Так вроде получилось вручную отослать autosave.sav Curl-ом из под Andriond



Для пришлось взять Curl из другой сборки (более новой) и

И командами cейв послать удалось и из под обычного пользователя. Единственная проблема что для того чтобы это сделать пришлось сперва рутом менять права файлов сперва самого curl


Код
chmod 777 system/xbin/curl


потом файла

Код
chmod 777 lib/libcurl.so.5


Соотвественно вопрос а можно как то сделать чтобы при людям не нужно было менять права этих файлов из под root потому что root он не у всех есть. У меня на планшете например нет и root есть только в VirtualBox-e
t800
Так я попробовал сделать следующее. В гугле по запросу "где лежат исполняемые файлы программ Androind" я прочитал что они лежат в

Код
data/app/



тогда я скопировал файл curl в data/app/wiki.kvkozyrev.org.fheroes2-t800/


Код
cp system/xbin/curl  data/app/wiki.kvkozyrev.org.fheroes2-t800/


И попробовал его оттуда запустить

Код
./data/app/wiki.kvkozyrev.org.fheroes2-t800/curl


и он запустился нормально

тогда я туда же переложил из папки lib файл libcurl.so.5

Код
mv lib/libcurl.so.5 data/app/wiki.kvkozyrev.org.fheroes2-t800/


и попробовал опять запустить curl камандой

Код
./data/app/wiki.kvkozyrev.org.fheroes2-t800/curl


но он не запустился сказав

Код
CANNOT LINK EXECUTABLE DEPENDENCIES:  library "curl.so.5" not found


Что делать? Почему curl не видит curl.so.5 хотя она лежит с ним в одной папке?
И куда ее надо положить так чтобы для этого не нужно было прав root но так чтобы curl ее видел?
feanor
Да, чот я не сообразил за мультиплатформенность.
Цитата
И еще я подумал а может просто попробовать скопировть из curl те каманды где он отправляет e-mail и
пусть игра сама письмо отравляет без всякого curl ?

Тогда надо вручную реализовывать хотя бы на тех же SDL-шных сокетах (чтобы лишний раз не мудохаться с той же кроссплатформенностью) протокол SMTP.
Он не особенно сложный, в принципе, текстовое общение с сервером да base-64 кодирование файлов, ну и вытащить его реализацию можно много откуда, но оно точно надо?
t800
Цитата(feanor @ 09 Oct 2016, 14:28) *
Да, чот я не сообразил за мультиплатформенность.
Цитата
И еще я подумал а может просто попробовать скопировть из curl те каманды где он отправляет e-mail и
пусть игра сама письмо отравляет без всякого curl ?

Тогда надо вручную реализовывать хотя бы на тех же SDL-шных сокетах (чтобы лишний раз не мудохаться с той же кроссплатформенностью) протокол SMTP.
Он не особенно сложный, в принципе, текстовое общение с сервером да base-64 кодирование файлов, ну и вытащить его реализацию можно много откуда, но оно точно надо?


Ну VDV_forever сказал что надо сделать турнирную вкладку в игру и чтобы можно было каждый месяц добавлять по одиночной турнирной карте, а Qwerty вообще сказал что для честного судейства надо так сделать чтоб ведущему могли отсылалист турнирыне сейвы на начало и конец дня.



Цитата(feanor @ 09 Oct 2016, 14:28) *
Да, чот я не сообразил за мультиплатформенность.
Цитата
И еще я подумал а может просто попробовать скопировть из curl те каманды где он отправляет e-mail и
пусть игра сама письмо отравляет без всякого curl ?

Тогда надо вручную реализовывать хотя бы на тех же SDL-шных сокетах (чтобы лишний раз не мудохаться с той же кроссплатформенностью) протокол SMTP.
Он не особенно сложный, в принципе, текстовое общение с сервером да base-64 кодирование файлов, ну и вытащить его реализацию можно много откуда.


Значит получается будет проще попробовать сделать самому за примера из SDL, чем пытаться этот curl во все сборки запихнуть и настроить чтоб нормально работал?
t800
Вот нашел в Google исходник какого то клиента на SDL_net


Код
// SDL_net Client | r3dux.org | 14/01/2011

// Includes for non-blocking keyboard input
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <termios.h> // If we do not include termios.h the client WILL compile but it WILL NOT WORK!
#include <unistd.h>
#include <fcntl.h>

#include <iostream>
#include <string>

#include <SDL_net.h>

using namespace std;

const unsigned short PORT        = 1234; // The port we are connecting to
const unsigned short BUFFER_SIZE = 512;  // Size of our message buffer (i.e. maximum length of characters in a message)

struct termios orig_termios;

// Function to reset the terminal to blocking mode
void reset_terminal_mode()
{
    tcsetattr(0, TCSANOW, &orig_termios);
}

// Sets the terminal mode to conio mode
void set_conio_terminal_mode()
{
    struct termios new_termios;

    // Take two copies - one for now, one for later
    tcgetattr(0, &orig_termios);
    memcpy(&new_termios, &orig_termios, sizeof(new_termios));

    // register cleanup handler, and set the new terminal mode
    //atexit(reset_terminal_mode); // Commented out because I switch and swap terminal modes a lot - just remember to call reset_terminal_mode() when we finish up
    cfmakeraw(&new_termios);
    tcsetattr(0, TCSANOW, &new_termios);
}

// Fuction to check if a key has been pressed
int kbHit()
{
    // How long to wait for input
    // Note: As soon as we get input the wait is immediately over - so it's not like our typing rate is limited in any way!
    long waitSeconds      = 1L;
    long waitMicroSeconds = 0L;
    struct timeval tv = { waitSeconds, waitMicroSeconds };

    // Create a file descriptor set
    fd_set fds;

    FD_SET(0, &fds);
    return select(1, &fds, NULL, NULL, &tv);
}

// Function to read the contents of the keypress
int getch()
{
    int r;
    unsigned char c;
    if ((r = read(0, &c, sizeof(c))) < 0)
    {
        //cout << "About to return a number..." << endl;
        return r;
    }
    else
    {
        //cout << "About to return a character..." << endl;
        return c;
    }
}

int main(int argc, char **argv)
{
    const char *host;         // Where we store the host name

    IPaddress serverIP;       // The IP we will connect to
    TCPsocket clientSocket;   // The socket to use
    string    serverName;     // The server name

    string userInput = "";    // A string to hold our user input
    int inputLength  = 0;     // The length of our string in characters
    char buffer[BUFFER_SIZE]; // Array of character's we'll use to transmit our message. We get input into the userInput string for ease of use, then just copy it to this character array and send it.

    // Initialise SDL_net
    if (SDLNet_Init() < 0)
    {
        cout << "Failed to intialise SDN_net: " << SDLNet_GetError() << "\n";
        exit(-1); // Quit!
    }

    // Ask the user for a server to connect to - can be entered as a hostname (i.e. localhost etc.) or an IP address (i.e. 127.0.0.1 etc.)
    cout << "Server Name: ";
    //getline(cin, serverName); // Uncomment this and remove the below line to change the server we're connecting to...
    serverName = "localhost";

    // Create the socket set with enough space to store our desired number of connections (i.e. sockets)
    SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
    if (socketSet == NULL)
    {
        cout << "Failed to allocate the socket set: " << SDLNet_GetError() << "\n";
        exit(-1); // Quit!
    }
    else
    {
        cout << "Successfully allocated socket set." << endl;
    }

    // Try to resolve the host. If successful, this places the connection details in the serverIP object
    int hostResolved = SDLNet_ResolveHost(&serverIP, serverName.c_str(), PORT);

    if (hostResolved == -1)
    {
        cout << "Failed to resolve the server hostname: " << SDLNet_GetError() << "\nContinuing...\n";
    }
    else // If we successfully resolved the host then output the details
    {
        // Get our IP address in proper dot-quad format by breaking up the 32-bit unsigned host address and splitting it into an array of four 8-bit unsigned numbers...
        Uint8 * dotQuad = (Uint8*)&serverIP.host;

        //... and then outputting them cast to integers. Then read the last 16 bits of the serverIP object to get the port number
        cout << "Successfully resolved host to IP: " << (unsigned short)dotQuad[0] << "." << (unsigned short)dotQuad[1] << "." << (unsigned short)dotQuad[2] << "." << (unsigned short)dotQuad[3];
        cout << " port " << SDLNet_Read16(&serverIP.port) << endl << endl;
    }

    // Try to resolve the IP of the server, just for kicks
    if ((host = SDLNet_ResolveIP(&serverIP)) == NULL)
    {
        cout << "Failed to resolve the server IP address: " << SDLNet_GetError() << endl;
    }
    else
    {
        cout << "Successfully resolved IP to host: " << host << endl;
    }

    // Flag to keep track of when to disconnect and finish up. We initially set it so that we CANNOT connect, and only change this to false when we got an "OK" response from the server
    bool shutdownClient = true;

    // Try to open a connection to the server and quit out if we can't connect
    clientSocket = SDLNet_TCP_Open(&serverIP);
    if (!clientSocket)
    {
        cout << "Failed to open socket to server: " << SDLNet_GetError() << "\n";
        exit(-1);
    }
    else // If we successfully opened a connection then check for the server response to our connection
    {
        cout << "Connection okay, about to read connection status from the server..." << endl;

        // Add our socket to the socket set for polling
        SDLNet_TCP_AddSocket(socketSet, clientSocket);

        // Wait for up to five seconds for a response from the server
        // Note: If we don't check the socket set and WAIT for the response, we'll be checking before the server can respond, and it'll look as if the server sent us nothing back
        int activeSockets = SDLNet_CheckSockets(socketSet, 5000);

        cout << "There are " << activeSockets << " socket(s) with data on them at the moment." << endl;

        // Check if we got a response from the server
        int gotServerResponse = SDLNet_SocketReady(clientSocket);

        if (gotServerResponse != 0)
        {
            cout << "Got a response from the server... " << endl;
            int serverResponseByteCount = SDLNet_TCP_Recv(clientSocket, buffer, BUFFER_SIZE);

            cout << "Got the following from server: " << buffer << "(" << serverResponseByteCount << " bytes)" << endl;

            // We got an okay from the server, so we can join!
            if ( strcmp(buffer, "OK") == 0 )
            {
                // So set the flag to say we're not quitting out just yet
                shutdownClient = false;

                cout << "Joining server now..." << endl << endl;
            }
            else
            {
                cout << "Server is full... Terminating connection." << endl;
            }
        }
        else
        {
            cout << "No response from server..." << endl;
        }

    } // End of if we managed to open a connection to the server condition

    bool wrotePrompt = false; // Whether or not we've already written the prompt
    bool sendMessage = false; // Whether or not it's time to send the message (flips to true when the user presses return)

    // While it's not time to shutdown the client...
    while (shutdownClient == false)
    {
        // Write the prompt only once per line of input. This gets reset so that it's displayed again after a message is sent
        if (wrotePrompt == false)
        {
            cout << "Write something:" << endl;
            wrotePrompt = true;
        }

        // If we've detected that the user has pressed a key..
        set_conio_terminal_mode();
        int status = kbHit();
        reset_terminal_mode();

        //cout << "status is: " << status << endl;

        if (status != 0)
        {
            //cout << "key was pressed and status is" << status << endl;

            // Get the keypress
            set_conio_terminal_mode();
            char theChar = getch();
            reset_terminal_mode();

            // Output the character to stdout
            cout << theChar;

            // Flush the character to the screen
            fflush(stdout);

            // If the keypressed wasn't return then add the character to our message string
            if ((int)theChar != 13)
            {
                //cout << "Got the character: " << theChar << " (which is number: " << int(theChar) << ")" << endl;

                // Add the character to our input string
                userInput += theChar;
            }
            else // Otherwise (if the user pressed enter) then send the message
            {
                //cout << "user pressed return" << endl;

                // Copy our user's string into our char array called "buffer"
                strcpy( buffer, userInput.c_str() );

                // Calculate the length of our input and then add 1 (for the terminating character) to get the total number of characters we need to send
                inputLength = strlen(buffer) + 1;

                // Send the message to the server
                if (SDLNet_TCP_Send(clientSocket, (void *)buffer, inputLength) < inputLength)
                {
                    cout << "Failed to send message: " << SDLNet_GetError() << endl;
                    exit(-1);
                }
                else
                {
                    //cout << "Message sent successfully." << endl;

                    // If we've asked the server to shutdown or we want out then set the flag appropriately
                    if (sendMessage == true && (userInput == "quit" || userInput == "exit" || userInput == "shutdown"))
                    {
                        shutdownClient = true;
                    }

                    // Reset for the next message
                    cout << endl;
                    wrotePrompt = false;
                    sendMessage = false;
                    userInput = "";
                }

            } // End of message sending section

        } // End of if the user pressed a key test

        // Check our socket set for activity. Don't wait if there's nothing on the socket just continue
        int socketActive = SDLNet_CheckSockets(socketSet, 0);

        //cout << "Sockets with data on them at the moment: " << activeSockets << endl;

        if (socketActive != 0)
        {
            // Check if we got a response from the server
            int messageFromServer = SDLNet_SocketReady(clientSocket);

            if (messageFromServer != 0)
            {
                //cout << "Got a response from the server... " << endl;
                int serverResponseByteCount = SDLNet_TCP_Recv(clientSocket, buffer, BUFFER_SIZE);

                cout << "Received: " << buffer << endl;// "(" << serverResponseByteCount << " bytes)" << endl;

                if (strcmp(buffer, "shutdown") == 0)
                {
                    cout << "Server is going down. Disconnecting..." << endl;
                    shutdownClient = true;
                }
            }
            else
            {
                //cout << "No response from server..." << endl;
            }

        } // End of if socket has activity check

    } // End of main while loop

    // Close our socket, cleanup SDL_net, reset the terminal mode and finish!
    SDLNet_TCP_Close(clientSocket);

    SDLNet_Quit();

    reset_terminal_mode();

    return 0;
}


Если я правилно понял мне для отправки письма мне надо поменять PORT = 1234 на PORT = 25 и указать свой сервер wiki.kvkozyrev.org?
t800
Ну я сейчас собрал этот пример вот такой камандой

Код
g++ client.cc -w -lSDL_net -o client


Только пришлось почему то поменять в нем строчку

Код
#include <SDL_net.h>


на

Код
#include </usr/include/SDL/SDL_net.h>


потому что он почему ругался что не может найти файл SDL_net.h

Так ну запустил этот клиент который собрал из примера он мне выдал вот такое

Код
danya@danya:~/hello$ ./client
Server Name: Successfully allocated socket set.
Successfully resolved host to IP: 217.11.71.62 port 25
Failed to resolve the server IP address:
Connection okay, about to read connection status from the server...
There are 1 socket(s) with data on them at the moment.
Got a response from the server...
Got the following from server: 220 wiki.kvkozуrev.org ESMTP Postfix (Ubuntu)
(43 bytes)
Server is full... Terminating connection.


И завершился.


Так какие каманды надо в него написать чтоб он е-mail отправил?
t800
Ладно пример чата на SDL_net у меня заработал а как письма отправилять разбираться наверно потом буду.
t800
Итак я нагуглил исходники программы корая сделана на SDL_net и умеет отсылает тектовые сообщения на e-mail
и подумал и решил что делать наверное будут так

1) Возьму код программы которая сдалана на SDL_net и умеет отсылать текстовые сообщения по почте
2) И изменю его чтобы она умела отсылать файлы проверю что все работает
3) А потом вставлю код этой программы в игру. Вот.
t800
Так разобрался с заголовками для оправки почты вот таким должен быть закодированный файл подготовленный для оправки двух файлов кодом SDLmail

Код
Subject: Turnir
MIME-Version: 1.0
Content-Type: multipart/mixed;
        boundary=----==--wiki.kvkozyrev.org
------==--wiki.kvkozyrev.org
Content-Transfer-Encoding: 7bit
Content-Type: text/html

Turnir=T-800
Days=190
Name=Ivan Ivanov


------==--wiki.kvkozyrev.org
Content-Disposition: attachment;
    filename=fheroes2.hgsc
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
    name=fheroes2.hgsc

AAAAaQAAAEoAAAAAeJz7+JmBgYEZiDlT9RKLEkuqUsuAHNYQXQsDg/B3FV+BnGAGBkZvHCreXk8G
ckKAKjyBNFtheWpRSSWSAX28QE40UNoJAEJ4GBE=
------==--wiki.kvkozyrev.org
Content-Disposition: attachment;
        filename=fheroes2.hgs
Content-Transfer-Encoding: base64
Content-Type: application/octet-stream;
        name=fheroes2.hgs

AAAAaQAAAEoAAAAAeJz7+JmBgYEZiDlT9RKLEkuqUsuAHNYQXQsDg/B3FV+BnGAGBkZvHCreXk8G
ckKAKjyBNFtheWpRSSWSAX28QE40UNoJAEJ4GBE=
------==--wiki.kvkozyrev.org


Разобрался просто: сперва отравил себе на почту два файла через Yandeх почту, посмотрел код полученного сообщения и погулил что значит каждая из строчек.
t800
Фух сделал со всеми заголовками
Код
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "base64.h"


int SendText ()
{                              
    char * TextBuf = (char*) malloc(sizeof(char) * 1024);
    FILE * ptrFile = fopen ( "output.txt" , "wb" );
    strcat(TextBuf,"Subject: Turnir\n");
    strcat(TextBuf,"MIME-Version: 1.0\n");
    strcat(TextBuf,"Content-Type: multipart/mixed;\n");
    strcat(TextBuf,"\tboundary=----==--wiki.kvkozyrev.org\n");
    strcat(TextBuf,"------==--wiki.kvkozyrev.org\n");
    strcat(TextBuf,"Content-Transfer-Encoding: 7bit\n");
    strcat(TextBuf,"Content-Type: text/html\n");
    strcat(TextBuf,"\n");
    //Здесь пищем турнирные данные в файл
    strcat(TextBuf,"Turnir=T-800<br/>\n");
    strcat(TextBuf,"Days=190<br/>\n");
    strcat(TextBuf,"Name=Ivan Ivanov<br/>\n");
    strcat(TextBuf,"------==--wiki.kvkozyrev.org\n");
    fputs(TextBuf, ptrFile);
    memset(TextBuf, 0, sizeof(TextBuf));
    fclose (ptrFile);
    return (0);
}

int Send(const char *FileName)
{
unsigned int q, i,res;
FILE* hFile = NULL;
hFile = fopen(FileName,"rb");

        if(hFile == NULL)
          {
              fputs("Ошибка файла \n", stderr);
              exit(1);
              }

  // определяем размер файла
  fseek(hFile , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
  long lSize = ftell(hFile);                            // получаем размер в байтах
  q = lSize/54+1;
  rewind (hFile);                                       // устанавливаем указатель в конец файла

  char * SendBuf = (char*) malloc(sizeof(char) * lSize);
  char * FileBuf = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
  char * TitleBuf = (char*) malloc(sizeof(char) * 1024);
  if (FileBuf  == NULL)
     {
      fputs("Ошибка памяти", stderr);
      exit(2);
     }
    // Делаем буфер:
    fseek (hFile,0,SEEK_SET);
    FILE * ptrFile = fopen ( "output.txt" , "ab" );
//Пишем заголовки
    memset(SendBuf, 0, sizeof(SendBuf)); // чистим буфер от мусора
    memset(TitleBuf, 0, sizeof(TitleBuf)); // чистим буфер от мусора
    strcat(TitleBuf,"Content-Disposition: attachment;\n");
    strcat(TitleBuf,"\tfilename=");
    strcat(TitleBuf,FileName);
    strcat(TitleBuf,"\n");
    strcat(TitleBuf,"Content-Transfer-Encoding: base64\n");
    strcat(TitleBuf,"Content-Type: application/octet-stream;\n");
    strcat(TitleBuf,"\tname=");
    strcat(TitleBuf,FileName);
    strcat(TitleBuf,"\n\n");
    fputs(TitleBuf, ptrFile);
//Кодируем и пищем файл
    for(i=0;i<q;i++)
    {
        res = fread(FileBuf,sizeof(char),54,hFile);
        strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
        strcat(SendBuf,"\r\n");
        fputs(SendBuf, ptrFile);
    }
    memset(SendBuf, 0, sizeof(SendBuf));
    strcat(SendBuf,"------==--wiki.kvkozyrev.org\n");
    fputs(SendBuf, ptrFile);
    fclose (ptrFile);
    fclose (hFile);
  return(0);
}

int main() {
SendText();
Send("fheroes2.hgs");
Send("fheroes2.hgsc");
Send("autosave.sav");
return 0;
}
t800
Собираюсь вставлять оправки файлов по e-mail код в игру.

У меня вопрос сеййчас прочитал про всякие классы и конструкторы деструкторы и меня возник вопрос?
А их обязательно делать? И можно просто попробовтаь вставить код без созданий всяких классов, конструкторов и деструкоторов.

Эроласт
Цитата(feanor @ 14 Oct 2016, 22:01) *
СРОЧНО УЧЕБНИК
t800
Цитата(Эроласт @ 18 Oct 2016, 18:08) *
Цитата(feanor @ 14 Oct 2016, 22:01) *
СРОЧНО УЧЕБНИК



А что учебник? В учебнике разные непонятные вещи написаны. Какие то классы какие то ООП и все такое.
А для чего это надо и для нужно ли это вообще ни слова не сказано. Я только понял что если делать через классы
то делать придется в несколько раз дольше. Потому что тот код который уже работает без всяких классов сделан.

Поэтому и спрашиваю, а обязательно нужно делать эти классы или можно просто вставить тот код что уже есть и все?
feanor
Пока что можно и без классов, хрен с ними.
Классы для удобства делаются.
fireman
BolgenOS 2.0 потому что из видео создаётся впечатление, что ты сам всё создал. На вопросы журналистов, о создание игры, надо было поправить, что ты создал форк к свободному движку, а графику, музыку, идею игру разработали ещё давно NWC.

P.S. Обидно, что журналисты даже не пытаются разобраться и создают очередной BolgenOS.
P.S.S. Советую на ютубе добавить в описание видео, что журналистка не совсем верно поняла, и пояснить что конкретно ты разработал. Если видео внезапно разлетится по интернету, то может начаться травля.

Цитата

Не стоит делать столько разных шрифтов на одной картинке, столько выделений.
DrSlash
Цитата(fireman @ 21 Oct 2016, 00:52) *
Обидно, что журналисты даже не пытаются разобраться и создают очередной BolgenOS.

А мне кажется, что они-то как раз понимают о чём речь, но им выгоднее раздуть сенсацию на ровном месте. Если взглянуть на новости, то там половина сюжетов такие (взять хотя бы сражение с ветряными мельницами в лице Pokemon Go).
t800
Цитата(fireman @ 21 Oct 2016, 03:52) *
BolgenOS 2.0 потому что из видео создаётся впечатление, что ты сам всё создал. На вопросы журналистов, о создание игры, надо было поправить, что ты создал форк к свободному движку, а графику, музыку, идею игру разработали ещё давно NWC.

P.S. Обидно, что журналисты даже не пытаются разобраться и создают очередной BolgenOS.
P.S.S. Советую на ютубе добавить в описание видео, что журналистка не совсем верно поняла, и пояснить что конкретно ты разработал. Если видео внезапно разлетится по интернету, то может начаться травля.


Ну вобще то в моей сборке и без того ведь большими буквами написано что я сделал только T-800 mod и Поддержку кампаний.



И тетеньке этой я сказал, что сделал только одну кампанию и изменил портреты. И том ролике которая я сам делал (и который к сборке приложен в описании, и который все смотрят) я говорю, что сделал только кампании.



А то что тетенька с телевидения от себя наговорила, ну наверное захотелось ей так...

PS Вообще этот ролик который с TV по-моему никто и не смотрит (всего 48 просмотров) и все смотрят ролик котрый мой и который с со сборкой идет (2300 просмотров) хотя примечание наверное можно написать.

PPPS Сейчас добавил примечание с пояснением к ролику с TB и с ссылками на соотвествующие тему на DF2 и HandbookHMM
t800
Читая сборник рубайат Омара Хайама, мне захотелось их послушать. Но на YouTube везде какая-то совсем не та музыка на заднем плане, которую я хотел. И вот, я обозначил несколько рубай галочками, включил heroes 2 (t800 Mod) и под музик-пак прочёл их. В общем, вот что получилось:

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.